1

カスタム を描画するために、システムのルック アンド フィールを拡張しましたJButton

UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
UIManager.put("ButtonUI", "com.my.package.MyButtonUI");

com.my.package.MyButtonUI:

public class MyButtonUI extends BasicButtonUI {

    public static final int BTN_HEIGHT = 24;
    private static final MyButtonUI INSTANCE = new MyButtonUI ();

    public static ComponentUI createUI(JComponent b) {
        return INSTANCE;
    }

    @Override
    public void paint(Graphics g, JComponent c) {
        AbstractButton b = (AbstractButton) c;
        Graphics2D g2d = (Graphics2D) g;
        GradientPaint gp;
        if (b.isEnabled()) {
            gp = new GradientPaint(0, 0, Color.red, 0, BTN_HEIGHT * 0.6f, Color.gray, true);
        } else {
            gp = new GradientPaint(0, 0, Color.black, 0, BTN_HEIGHT * 0.6f, Color.blue, true);
        }
        g2d.setPaint(gp);
        g2d.fillRect(0, 0, b.getWidth(), BTN_HEIGHT);
        super.paint(g, b);
    }

    @Override
    public void update(Graphics g, JComponent c) {
        AbstractButton b = (AbstractButton) c;
        b.setForeground(Color.white);
        paint(g, b);
    }
}

setPreferredSize()次に、これらのボタンにその制約を追加します。クライアント コードで a が呼び出された場合を除き、ボタンのサイズを 70x24にします。どうやってやるの?

注: メソッドに a を入れるとsetPreferredSize()MyButtonUI.update()client がオーバーライドされsetPreferredSize()、すべてのボタンが同じサイズになります。

ありがとうございました。

編集:

Guillaume のおかげで、getPreferredSize()(in MyButtonUI) を次のようにオーバーライドしました。

@Override
public Dimension getPreferredSize(JComponent c) {
    AbstractButton button = (AbstractButton) c;
    int width = Math.max(button.getWidth(), BUTTON_WIDTH);
    int height = Math.max(button.getHeight(), BUTTON_HEIGHT);
    return new Dimension(width, height);
}

そしてそれはうまくいきます。

4

2 に答える 2

3

getPreferredSize()クラスでメソッドをオーバーライドするだけMyButtonUIです。プログラマーが任意に優先サイズを別のサイズに設定した場合、コードは呼び出されません。これが JComponent のデフォルトの動作です。

のコードを参照してくださいgetPreferredSize():

public Dimension getPreferredSize() {
    if (isPreferredSizeSet()) {
        return super.getPreferredSize();
    }
    Dimension size = null;
    if (ui != null) {
        size = ui.getPreferredSize(this);
    }
    return (size != null) ? size : super.getPreferredSize();
}
于 2012-09-28T14:58:07.623 に答える
0

ボタンのコンストラクターで優先サイズを 70x24 に設定して、その設定を行ってみませんか。クライアントが setPreferredSize を再度呼び出すと、それがオーバーライドされます。

于 2012-09-28T14:55:01.243 に答える