【问题标题】:How do I use a default Nimbus color with UIManager?如何在 UIManager 中使用默认的 Nimbus 颜色?
【发布时间】:2011-11-13 07:04:20
【问题描述】:

我有一个自定义 ListCellRenderer,并希望使用默认的 Nimbus 选择背景颜色。我可以通过以下方式查找颜色:

Color selectionBackground = UIManager.getColor("nimbusSelectionBackground");

如果我打印它,它的值与Nimbus default colors 上的值相同。但是当我在 JPanel 上使用它时,我得到了不同的灰色,如何使用 UIManager 中的颜色?

当我这样做时:

setBackground(Color.RED);

JPanels 背景显示为红色,但当我这样做时:

setBackground(selectionBackground);

使用了“selectionBackground”颜色,而是使用了灰色。


这是一个例子和截图:

背景应该是:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UIManager.LookAndFeelInfo;

public class PanelColor {

    public static void main(String[] args) {

        // switch to Nimbus Look And Feel
        for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
            if ("Nimbus".equals(info.getName())) {
                try {
                    UIManager.setLookAndFeel(info.getClassName());
                } catch (Exception e) { e.printStackTrace(); }
                break;
            }
        }

        Color selectionBackground = UIManager.getColor("nimbusSelectionBackground");

        JPanel panel = new JPanel(new BorderLayout());
        panel.setPreferredSize(new Dimension(300,50));
        panel.add(new JLabel(selectionBackground.toString()), BorderLayout.NORTH);

        // is not showing the selectionBackground color
        panel.setBackground(selectionBackground);

        JFrame frame = new JFrame();
        frame.add(panel);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setVisible(true);
    }
}

【问题讨论】:

  • 以下问题是否可以帮助您使用 Nimbus - stackoverflow.com/questions/5840599/…
  • 哇,很奇怪。我检查了代码:返回的颜色是 javax.swing.plaf.ColorUIResource 类型。但我不明白这会如何导致任何问题,因为它是 Color 的子类。 ColorUIResource 的代码没有什么特别之处,没有对 UI 的引用什么的。正如乔伊建议的那样,selectionBackground = new Color(selectionBackground.getRGB()); 有效。

标签: java swing colors nimbus uimanager


【解决方案1】:

我认为 Nimbus 不会“拒绝”设置颜色。它错误地假设您没有覆盖默认值,因为 UIManager.getColor() 返回 ColorUIResource 的实例。

ColorUIResource 只是一个实现 UIResource 标记接口的 Color。根据 Javadoc,L&Fs“使用这个接口来决定一个属性值是否被覆盖”。 Nimbus 检查背景颜色,发现您没有覆盖它,然后退回到一些您不期望的内部行为。

【讨论】:

    【解决方案2】:

    Nimbus 显然拒绝将其颜色用于其他地方。不久前我也偶然发现了这一点,当时我最好的解决方案是使用组件(您可以查询)创建一个新的Color 并使用它。当然,即使 L&F 改变了,你也要坚持那个颜色。

    我知道这就是您从 UIManager 返回的 DerivedColor 的全部意义所在。不过我还没有找到更好的解决方案。

    对于其他 L&F 和其他事情也是如此。例如。 GTK L&F 很乐意为您提供您想要的图标,但它们不会在您自己的控件中绘制。我想部分原因在于 Swing (a) 非常复杂,并且 (b) 没有任何 L&F 真正遵守合同,即使是 Nimbus,尽管它是最新和最酷的。

    【讨论】:

    猜你喜欢
    • 2012-12-18
    • 1970-01-01
    • 1970-01-01
    • 2011-11-02
    • 1970-01-01
    • 2014-08-02
    • 1970-01-01
    • 2012-10-12
    • 1970-01-01
    相关资源
    最近更新 更多