Nimbus外观如何调整菜单栏的颜色?

4
我尝试调整Nimbus外观的颜色,但是只有部分生效。特别是在调整菜单栏的颜色方面遇到了问题。
以下是一个运行示例:
import java.awt.Color;
import java.awt.Dimension;

import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.UIManager.LookAndFeelInfo;
import javax.swing.UnsupportedLookAndFeelException;

public class JMenuColorTest extends JFrame {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                try {
                    adjustLAF();
                } catch (Exception e) {
                    e.printStackTrace();
                }

                JMenuColorTest test = new JMenuColorTest();
                test.setDefaultCloseOperation(EXIT_ON_CLOSE);
                test.setPreferredSize(new Dimension(400, 300));
                test.pack();
                test.setLocationRelativeTo(null);

                JMenuBar menuBar = new JMenuBar();
                JMenu menu1 = new JMenu("Menu 1");
                menu1.add(new JMenuItem("Item 1.1"));
                menu1.add(new JMenuItem("Item 1.2"));
                menu1.add(new JMenuItem("Item 1.3"));
                menuBar.add(menu1);
                JMenu menu2 = new JMenu("Menu 2");
                menu2.add(new JMenuItem("Item 2.1"));
                menu2.add(new JMenuItem("Item 2.2"));
                menu2.add(new JMenuItem("Item 2.3"));
                menuBar.add(menu2);
                test.setJMenuBar(menuBar);

                test.setVisible(true);
            }

            private void adjustLAF() throws ClassNotFoundException,
                InstantiationException, IllegalAccessException,
                UnsupportedLookAndFeelException {
                for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
                    if ("Nimbus".equals(info.getName())) {

                        // Working
                        UIManager.put("control", Color.GREEN);

                        // Not working
                        UIManager.getLookAndFeelDefaults().put(
                            "MenuItem[Enabled].textForeground", Color.RED);

                        // Set the look and feel
                        UIManager.setLookAndFeel(info.getClassName());

                        // Not working
                        UIManager.put("control", Color.GREEN);

                        // Working
                        UIManager.getLookAndFeelDefaults().put(
                            "MenuItem[Enabled].textForeground", Color.RED);

                        break;
                    }
                }

            }
        });
    }
}

您可以看到,我能够设置控件的背景,并设置JMenuItem的前景色。但是我不能更改JMenuItem的背景颜色,也不能更改菜单栏的颜色。我尝试了很多来自http://docs.oracle.com/javase/tutorial/uiswing/lookandfeel/_nimbusDefaults.html的键,但我无法更改menubar的颜色。
另一个问题是?为什么在设置外观和感觉之前必须调整颜色一次,在设置外观和感觉后再调整一次?为什么必须调用一次'UIManager.put()'和一次'UIManager.getLookAndFeelDefaults()。put()'?
对我来说,Nimbus真的很有缺陷,不适合专业使用。我尝试使用JDK 1.6.35和JDK 1.7.7,但两个JDK都无法以所需的方式运行系统?
有没有建议如何调整Nimbus LookAnd Feel中menubar的颜色?
提前致谢

在调用Runnable之前调用静态的adjustLAF似乎在Mac OS X Aqua上有效。 - trashgod
2个回答

5

如果 JMenuBar 需要使用 Painter,则需要检查 NimbusDefault#value

MenuBar[Enabled].backgroundPainter
MenuBar[Enabled].borderPainter

其余内容由trashgod+1回答。


谢谢你的回答。背景颜色现在正常工作了。但是你知道如何设置前景(文本颜色)吗?'UIManager.getLookAndFeelDefaults().put("MenuBar.foreground", Color.CYAN)' 不起作用。 - hami
@hami 在 if ("Nimbus".equals(info.getName())) { 内的第一行代码必须是 UIManager.setLookAndFeel(info.getClassName());,然后你可以放置(并且所有更改都必须是)UIManager.getLookAndFeelDefaults().put("Xxx", "Xxx"),也许看起来很奇怪,但有简单的逻辑。 - mKorbel
嗯,我很清楚你脑海中的这个ZOO(JComponent及其值),并且对于 UIManager.getLookAndFeelDefaults().put("Menu[Enabled].textForeground", Color.GREEN); 或者 UIManager.getLookAndFeelDefaults().put("Menu[Selected].textForeground", Color.GREEN); 没有任何问题。 - mKorbel
1
@trashgod 不是的,因为它缺少了GradientPaint,只有Filler :-) - mKorbel
1
@mKorbel,根据我对Nimbus的了解,您应该设置主要颜色和可能的次要颜色以实现良好的颜色主题。然后,组件的颜色会自动设置为一个不错的值。这并不完美,但是Nimbus#nimbusBase、Nimbus#nimbusBlueGray和Nimbus#control是有效的。但显然,在设置LAF之前必须调用UIManager.put来设置主要和次要颜色,而在之后必须调用UIManager.getLookAndFeelDefaults().put来直接设置组件的颜色。 - hami
显示剩余5条评论

3
使adjustLAF()静态化并在Runnable之前调用它似乎可以在Mac OS X上使用com.apple.laf.AquaLookAndFeel

enter image description here

import java.awt.Color;
import java.awt.Dimension;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.UIManager.LookAndFeelInfo;
import javax.swing.UnsupportedLookAndFeelException;

public class JMenuColorTest extends JFrame {

    public static void main(String[] args) {
                try {
                    adjustLAF();
                } catch (Exception e) {
                    e.printStackTrace();
                }

        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {

                JMenuColorTest test = new JMenuColorTest();
                test.setDefaultCloseOperation(EXIT_ON_CLOSE);
                test.setPreferredSize(new Dimension(400, 300));
                test.pack();
                test.setLocationRelativeTo(null);

                JMenuBar menuBar = new JMenuBar();
                JMenu menu1 = new JMenu("Menu 1");
                menu1.add(new JMenuItem("Item 1.1"));
                menu1.add(new JMenuItem("Item 1.2"));
                menu1.add(new JMenuItem("Item 1.3"));
                menuBar.add(menu1);
                JMenu menu2 = new JMenu("Menu 2");
                menu2.add(new JMenuItem("Item 2.1"));
                menu2.add(new JMenuItem("Item 2.2"));
                menu2.add(new JMenuItem("Item 2.3"));
                menuBar.add(menu2);
                test.setJMenuBar(menuBar);

                test.setVisible(true);
            }

        });
    }
    private static void adjustLAF() throws ClassNotFoundException,
        InstantiationException, IllegalAccessException,
        UnsupportedLookAndFeelException {
        for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
            if ("Nimbus".equals(info.getName())) {

                // Working
                UIManager.put("control", Color.GREEN);

                // Not working
                UIManager.getLookAndFeelDefaults().put(
                    "MenuItem[Enabled].textForeground", Color.RED);

                // Set the look and feel
                UIManager.setLookAndFeel(info.getClassName());

                // Not working
                UIManager.put("control", Color.GREEN);

                // Working
                UIManager.getLookAndFeelDefaults().put(
                    "MenuItem[Enabled].textForeground", Color.RED);

                break;
            }
        }

    }
}

这在Windows和我的示例上都有效,但我想为MenuBar着色,就像mKorbel在他的答案中描述的那样。 - hami
@trashgod,你能告诉我如何更改菜单选择颜色吗?我已经尝试了"nimbusSelection",Color.red,但这只更改了menuitem的选择颜色,而不是整个menu - Vighanesh Gursale
尝试更改"Menu[Enabled].textForeground" - trashgod

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接