Java Nimbus外观和感觉调整菜单栏的颜色

Java Nimbus外观和感觉调整菜单栏的颜色,java,swing,look-and-feel,nimbus,jmenubar,Java,Swing,Look And Feel,Nimbus,Jmenubar,我正在尝试调整光轮的外观和感觉的颜色,但它只是部分工作。尤其是我在调整菜单栏的颜色时遇到了问题 下面是一个运行示例: 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.SwingUtil

我正在尝试调整光轮的外观和感觉的颜色,但它只是部分工作。尤其是我在调整菜单栏的颜色时遇到了问题

下面是一个运行示例:

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的背景,也无法更改菜单栏的颜色。我尝试了很多键,但我无法更改菜单栏的颜色

另一个问题是?为什么我必须在设置外观之前和设置外观之后调用颜色调整一次?为什么我必须调用一次“UIManager.put()”和一次“UIManager.getLookAndFeelDefaults().put()”

在我看来,Nimbus真的很有问题,不适合专业人士使用。我尝试同时使用JDK1.6.35和JDK1.7.7,但使用这两种JDK,我无法使系统按预期运行

有没有关于如何在Nimbus LookandFeel中调整菜单栏颜色的建议

提前感谢

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

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;
            }
        }

    }
}


对于
JMenuBar
必须使用,检查


rest的答案是
trashgod+1

在调用
Runnable
之前调用一个静态的
adjustLAF
似乎在Mac OS X aqua上工作。这在Windows和我的示例中也起作用,但我想给菜单栏的背景上色,就像mKorbel在回答中描述的那样。@trashgood你能告诉我如何改变菜单上的选择颜色吗<代码>“nimbusSelection”,Color.red我已经这样做了,但是这会改变
菜单项
的颜色选择,但不会改变
菜单
。请尝试更改
“菜单[已启用]。文本前景”
。谢谢您的回答。背景的颜色现在可以正常工作了。但是你知道如何设置前景(文本的颜色)吗UIManager.getLookAndFeelDefaults().put(“MenuBar.foreground”,Color.CYAN)”不起作用。@hami
if(“Nimbus”.equals(info.getName()){
必须是
UIManager.setLookAndFeel(info.getClassName());
,然后在你可以放置(所有更改必须是)
UIManager.getLookAndFeelDefaults().put(“Xxx”,“Xxx”)
,可能看起来很奇怪,但用简单的逻辑嗯,我肯定不理解你头脑中的这个动物园(JComponent及其值),而且对
UIManager.getLookAndFeelDefaults().put(“菜单[Enabled].textForeground],Color.GREEN”);
UIManager.getLookAndFeelDefaults().put(“菜单[Selected].textForeground”)“,颜色。绿色)
@trashgood不,不是,因为它错过了GradientPaint…,只有填充物:-)@mKorbel当我读到关于Nimbus的文章时,你应该设置原色和可能的副色,以实现一个精细的颜色主题。然后组件的颜色会自动设置为一个很好的值。这不是很好用,而是Nimbus#nimbusBase,Nimbus#Nimbus#BlueGray和Nimbus#control正在工作。但显然,您必须在设置LAF之前调用
UIManager.put
来设置主颜色和次颜色,而您必须在设置LAF之后调用
UIManager.getLookAndFeelDefaults()。put
来直接设置组件的颜色。
MenuBar[Enabled].backgroundPainter
MenuBar[Enabled].borderPainter