ニンバスは見栄えがすることがよくありますが、特定の色の組み合わせでは、結果が最適ではありません。私の場合、aの背景がJPopupMenu合わないので、手動で設定したいと思います。
私はJava7を使用していますが、興味深いことに、NimbusはUIManager(のようなPopupMenu.background)のいくつかのプロパティの設定を完全に無視します。JPopupMenuしたがって、私の唯一のオプションは、そのオーバーライドのサブクラスを作成することでしたpaintComponent(...)。私は知っています、それは厄介ですが、少なくともそれはうまくいきました。
ただし、JMenuを別のメニューに追加すると、それ自体のインスタンスが埋め込まれJPopupMenu、それを自分のサブクラスに置き換える方法がわかりませんでした。
埋め込みインスタンスに独自のものを割り当ててPopupMenuUIも、結果は得られませんでした。JPopupMenuオーバーライドされたメソッドから直接継承された場合paint(...)は呼び出されましたが、何をしても何も描画されませんでした。継承元javax.swing.plaf.synth.SynthPopupMenuUI paintが呼び出されない場合、結果は私がまったく自分自身PopupMenuUIを設定しなかった場合になります。
JPopupMenuしたがって、簡単な質問は次のとおりです。Java7でL&FとしてNimbusを使用して、1つまたは(それが簡単な場合は)すべての背景色を調整するにはどうすればよいですか?
編集:コード例
次のコードと結果を見てください。
public static void main(final String[] args) {
try {
UIManager.setLookAndFeel(NimbusLookAndFeel.class.getCanonicalName());
UIManager.getLookAndFeelDefaults().put("PopupMenu.background", Color.GREEN);
UIManager.getLookAndFeelDefaults().put("Panel.background", Color.RED);
UIManager.getLookAndFeelDefaults().put("List.background", Color.BLUE);
} catch (ClassNotFoundException | InstantiationException
| IllegalAccessException | UnsupportedLookAndFeelException e) {
e.printStackTrace();
}
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(200,200);
JPanel panel = new JPanel(new BorderLayout());
panel.setBorder(BorderFactory.createEmptyBorder(10,10,10,10));
JList list = new JList();
panel.add(list);
frame.getContentPane().add(panel);
JPopupMenu menu = new JPopupMenu();
menu.add(new JMenuItem("A"));
menu.add(new JMenuItem("B"));
menu.add(new JMenuItem("C"));
frame.setVisible(true);
menu.show(frame, 50, 50);
}
UIManager.put(key, value)L&Fを設定するUIManager.getLookAndFeelDefautls().put(key,value) 前に使用する必要があると言う人もいますが、私にとっては結果は得られません(つまり、デフォルトの色はまったく変更されません)。上記のコードは少なくとも以下をもたらします:

を使用すると、同じことが起こります(何も意味しません)JPopupMenu.setBackground(...)。これは、ニンバスが内部ペインターを使用しているためです。内部ペインターは、ニンバスの原色から色を計算し、コンポーネントのプロパティを無視します。この例では、回避策として以下を使用できます。
JPopupMenu menu = new JPopupMenu() {
@Override
public void paintComponent(final Graphics g) {
g.setColor(Color.GREEN);
g.fillRect(0,0,getWidth(), getHeight());
}
};
これは

ただし、この回避策は、JMenuそれ自体がラップするを挿入した場合は機能しませJPopupMenuん。オーバーライドすることはできません。
JMenu jmenu = new JMenu("D");
jmenu.add(new JMenuItem("E"));
menu.add(jmenu);
予想通り、与える:

JPopupMenuこれはを使用して取得できますJMenu.getPopupMenu()が、設定することはできません。の独自のサブクラスでこのメソッドをオーバーライドしても、ゲッターを使用せずにのラップされたインスタンスにアクセスするように見えるためJMenu、結果は得られません。JMenuJPopupMenu
