JPopupMenuの背景色を変更する
Total: 309
, Today: 2
, Yesterday: 3
Posted by aterai at
Last-modified:
概要
JPopupMenu
の背景色、縁色とその子要素として配置されたJMenuItem
などの文字色を変更します。
Screenshot
Advertisement
サンプルコード
class DarkModePopupMenu extends JPopupMenu {
@Override public void updateUI() {
super.updateUI();
setUI(new BasicPopupMenuUI());
setBackground(Color.DARK_GRAY);
setBorder(new BorderUIResource(
BorderFactory.createLineBorder(Color.LIGHT_GRAY)));
EventQueue.invokeLater(() -> {
for (MenuElement m : getSubElements()) {
Component c = m.getComponent();
c.setForeground(Color.WHITE);
// for Metal, Windows Classic LookAndFeel
((JComponent) c).setOpaque(false);
}
});
}
}
View in GitHub: Java, Kotlin解説
Default
- デフォルトの
JPopupMenu
で、LookAndFeel
で設定された背景色などで描画される
- デフォルトの
setBackground(...)
JPopupMenu#setBackground(...)
などで背景色を設定UIManager.put("PopupMenu.background", Color.DARK_GRAY)
ですべてのJPopupMenu
の文字色をまとめて変更可能WindowsLookAndFeel
、NimbusLookAndFeel
などでは上記のJPopupMenu#setBackground(...)
の設定は無効
JPopupMenu#setForeground(...)
を設定しても子要素として配置されたJMenuItem
などの文字色には影響しない- このサンプルでは指定した
JPopupMenu
の子要素の文字色のみ変更するため、JPopupMenu#getSubElements()
でMenuElement
を取得しそのComponent
にComponent#setForeground(Color.WHITE)
で文字色を設定している UIManager.put("MenuItem.foreground", Color.WHITE)
などですべてのMenuItem
の文字色をまとめて変更可能JMenuItem
を継承するJCheckBoxMenuItem
などには適用されないので、別途CheckBoxMenuItem.foreground
、RadioButtonMenuItem.foreground
を使用する必要がある
- このサンプルでは指定した
BasicPopupMenuUI
JPopupMenu#setBackground(...)
などで設定した色で背景全体を塗りつぶすBasicPopupMenuUI
を設定してLookAndFeel
依存を排除JPopupMenu#paintComponent(...)
をオーバーライドして背景を描画する方法と同等NimbusLookAndFeel
などでJCheckBoxMenuItem
のチェックアイコン色を変更する方法がない?RadioButtonMenuItemPainter
のprivate Color color3 = decodeColor("nimbusBlueGrey", ...);
を変更したいが難しい