【问题标题】:Nimbus Look And Feel adjust colors of menubarNimbus Look And Feel 调整菜单栏的颜色
【发布时间】:2012-09-11 12:31:21
【问题描述】:

我正在尝试调整 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 的背景,也无法更改 MenuBar 的颜色。我从http://docs.oracle.com/javase/tutorial/uiswing/lookandfeel/_nimbusDefaults.html 尝试了很多键,但我无法更改菜单栏的颜色。

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

在我看来,Nimbus 确实有问题,不适合专业使用。我尝试同时使用 JDK 1.6.35 和 JDK 1.7.7,但是使用这两个 JDK 都无法让系统按预期运行?

关于如何在 Nimbus LookAnd Feel 中调整菜单栏颜色的任何建议?

提前致谢

【问题讨论】:

  • 调用静态adjustLAF 之前 调用Runnable 似乎在Mac OS X aqua 上工作。

标签: java swing look-and-feel nimbus jmenubar


【解决方案1】:

JMenuBar 必须使用Painter,检查NimbusDefault#value

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

trashgod +1 回复休息

【讨论】:

  • 感谢您的回答。背景的颜色现在可以正常工作了。但是你知道如何设置前景(文本的颜色)吗? '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("Menu[Enabled].textForeground", Color.GREEN); UIManager.getLookAndFeelDefaults().put("Menu[Selected].textForeground", Color.GREEN); 没有问题
  • @trashgod 不,不是,因为它错过了 GradientPaint...,只有 Filler :-)
  • @mKorbel 当我读到 Nimbus 时,您应该设置原色和可能的次要颜色以实现精美的颜色主题。然后组件的颜色会自动设置为一个不错的值。这不能正常工作,但 Nimbus#nimbusBase、Nimbus#nimbusBlueGray 和 Nimbus#control 正在工作。但显然你必须调用UIManager.put 之前设置LAF来设置主要和次要颜色,而你必须调用UIManager.getLookAndFeelDefaults().put 之后来设置颜色直接的组件。
【解决方案2】:

adjustLAF() 设为静态并在之前调用它Runnable 似乎可以在带有com.apple.laf.AquaLookAndFeel 的Mac OS X 上运行。

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 在他的回答中描述的那样。
  • @trashgod 你能告诉我如何改变菜单上的选择颜色吗? "nimbusSelection",Color.red 我已经这样做了,但这会改变menuitem 的颜色选择,但不会改变menu
  • 尝试更改"Menu[Enabled].textForeground"
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-30
  • 1970-01-01
  • 1970-01-01
  • 2018-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多