控制自定义Synth Look&中复选框的布局感觉

时间:2010-07-08 19:43:21

标签: java user-interface swing look-and-feel synth

我正在尝试使用Synth实现自定义“Steampunk”主题外观 - 基本上提供SynthStyle,SynthPainter和SynthStyleFactory的自定义版本。

我没有使用任何XML,即一切都是通过Java API完成的。总的来说,这工作得很好,实际上看起来很不错。

但是我遇到了一些“复合”组件,例如JCheckBox。当在SynthPainter上调用paintCheckBoxBackground()时,坐标指的是JCheckBox覆盖的整个区域。

如何确定此区域中的复选框图标和文本需要单独绘制的位置?

1 个答案:

答案 0 :(得分:1)

嗯,以下将有所帮助 (代码将放入与JCheckBox关联的自定义画家):

public void paintCheckBoxBackground(SynthContext context, Graphics g, int x, int y, int w, int h){

    AbstractButton c = (AbstractButton) context.getComponent();
    String text = c.getText();
    Icon icon = c.getIcon();
    if (icon == null){
        icon = context.getStyle().getIcon(context, "CheckBox.icon");
    };        
    int iconTextGap = c.getIconTextGap();       

    Rectangle componentRect = new Rectangle();
    Rectangle iconR = new Rectangle();

    Insets insets = new Insets(0, 0, 0, 0);
    if (context.getRegion().isSubregion()){
        insets = context.getStyle().getInsets(context, insets);
    }
    else{
        insets = context.getComponent().getInsets(insets);
    }

    componentRect.x = insets.left;
    componentRect.y = insets.top;
    componentRect.width = c.getWidth() - (insets.left + insets.right);
    componentRect.height = c.getHeight() - (insets.top + insets.bottom);

    if (icon != null){
        iconR.x += componentRect.x;
        iconR.y += componentRect.y;
        iconR.width = icon.getIconWidth();
        iconR.height = icon.getIconHeight();

        g.setColor(Color.GREEN);
        g.fillRect(iconR.x, iconR.y, iconR.width, iconR.height);
    }
    if (text != null){
        g.setColor(Color.RED);
        int textPos = iconR.x + iconR.width + iconTextGap;
        g.fillRect(textPos, iconR.y, c.getWidth() - insets.right - textPos, componentRect.height);            
    }
}

请注意,这里只考虑最常见的情况(左右对齐,图标的文字右侧)。 有关更复杂的案例处理,请参阅SwingUtilities.layoutCompoundLabel

的源代码