JPopupMenuの背景色を変更する
Total: 890, Today: 2, Yesterday: 1
Posted by aterai at
Last-modified:
Summary
JPopupMenuの背景色、縁色とその子要素として配置されたJMenuItemなどの文字色を変更します。
Screenshot

Advertisement
Source Code Examples
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, KotlinDescription
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を使用する必要がある
- このサンプルでは指定した
BasicPopupMenuUIJPopupMenu#setBackground(...)などで設定した色で背景全体を塗りつぶすBasicPopupMenuUIを設定してLookAndFeel依存を排除JPopupMenu#paintComponent(...)をオーバーライドして背景を描画する方法と同等NimbusLookAndFeelなどでJCheckBoxMenuItemのチェックアイコン色を変更する方法がない?RadioButtonMenuItemPainterのprivate Color color3 = decodeColor("nimbusBlueGrey", ...);を変更したいが難しい