Swing/PopupMenuBackground のバックアップ(No.1)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/PopupMenuBackground へ行く。
- 1 (2024-05-20 (月) 04:42:50)
- category: swing folder: PopupMenuBackground title: JPopupMenuの背景色を変更する tags: [JPopupMenu, LookAndFeel] author: aterai pubdate: 2024-05-20T04:39:47+09:00 description: JPopupMenuの背景色、縁色とその子要素として配置されたJMenuItemなどの文字色を変更します。 image: https://drive.google.com/uc?id=1mWrQkp8xsggKT-l2SXbNvWOWtClPPPeT
概要
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", ...);
を変更したいが難しい