JMenuのArrowIconを変更する
Total: 1939
, Today: 2
, Yesterday: 1
Posted by aterai at
Last-modified:
概要
JMenu
の右端に表示されるArrowIcon
の形状や選択色などを変更します。
Screenshot
Advertisement
サンプルコード
UIManager.put("Menu.arrowIcon", new ArrowIcon());
// or: UIManager.getLookAndFeelDefaults().put("Menu.arrowIcon", new ArrowIcon());
// ...
class ArrowIcon implements Icon {
@Override public void paintIcon(Component c, Graphics g, int x, int y) {
Graphics2D g2 = (Graphics2D) g.create();
if (c instanceof AbstractButton && ((AbstractButton) c).getModel().isSelected()) {
g2.setPaint(Color.WHITE);
} else {
g2.setPaint(Color.GRAY);
}
int w = getIconWidth() / 2;
Path2D p = new Path2D.Double();
p.moveTo(0, 0);
p.lineTo(w, w);
p.lineTo(0, getIconHeight());
p.closePath();
g2.translate(x, y);
g2.fill(p);
g2.dispose();
}
@Override public int getIconWidth() {
return 8;
}
@Override public int getIconHeight() {
return 8;
}
}
View in GitHub: Java, Kotlin解説
上記のサンプルでは、UIManager.put("Menu.arrowIcon", new Icon() {...})
を使用してJMenu
が使用するArrowIcon
を変更しています。
Icon#paintIcon(...)
メソッドをオーバーライドしてJMenu
が選択されている場合は色を変更if (c instanceof AbstractButton && ((AbstractButton) c).getModel().isSelected()) { g2.setPaint(Color.WHITE); } else { g2.setPaint(Color.GRAY); }
WindowsLookAndFeel
でJMenu
が選択されてサブメニューが表示されたときにArrowIcon
と重ならないようにアイコンの右側に余白を設定NimbusLookAndFeel
ではUIManager.put("Menu.arrowIcon", new Icon() {...})
は無効、かつJMenuBar
に追加されているJMenu
にMenu.arrowIcon
が不正に表示されてしまう?- 以下のように
UIManager.getLookAndFeelDefaults()
でアイコンを設定するとNimbusLookAndFeel
でも有効だが、JMenuBar
に追加されているJMenu
にMenu.arrowIcon
が不正に表示されてしまう現象は同じUIManager.getLookAndFeelDefaults().put("Menu.arrowIcon", new ArrowIcon());
NimbusLookAndFeel
などの場合、個別にJMenu#putClientProperty("Nimbus.Overrides", ...)
でアイコンを変更することで回避可能- 親が
JMenuBar
のコンポーネントにアイコンが設定されている場合は非表示にすることで回避可能class ArrowIcon implements Icon { @Override public void paintIcon(Component c, Graphics g, int x, int y) { Container parent = SwingUtilities.getUnwrappedParent(c); if (parent instanceof JMenuBar) { return; } Graphics2D g2 = (Graphics2D) g.create(); // ...