我有一个自定义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);
}
}
答案 0 :(得分:5)
我不认为Nimbus“拒绝”设置颜色。它错误地假定您没有覆盖默认值,因为UIManager.getColor()返回ColorUIResource的实例。
ColorUIResource只是一个实现UIResource标记接口的Color。根据Javadoc,L& Fs“使用此接口来判断属性值是否已被覆盖”。 Nimbus检查背景颜色,注意到你没有覆盖它,并且回到了一些你不期望的内部行为。
答案 1 :(得分:4)
Color
并使用它。当然,即使L& F被改变,你也会坚持使用那种颜色。
我知道你从UIManager那里回来的DerivedColor
的全部意义。我没有找到更好的解决方案。
对于其他L& Fs和其他事情也是如此。例如。 GTK L& F很乐意为您提供您想要的图标,但它们不会用您自己的控件绘制。我猜这一切的部分原因是Swing是(a)非常复杂而且(b)没有L& F实际上遵守合同,甚至不是Nimbus,尽管它是最新和最酷的合同。