カスタム を描画するために、システムのルック アンド フィールを拡張しました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);
}
そしてそれはうまくいきます。