【发布时间】:2018-04-13 11:13:58
【问题描述】:
我是 Java Nimbus 外观和感觉的新手。我正在尝试使用 Nimbus 的功能来自定义单个组件实例,使用 putClientProperty("Nimbus.Overrides", overrides):https://docs.oracle.com/javase/8/docs/api/javax/swing/plaf/nimbus/package-summary.html
我遇到了以下问题(bug?):
不幸的是,“Nimbus.Overrides”值显然不仅会影响明确设置它的组件对象,还会影响其他对象。
似乎自定义属性以某种方式“继承”给相同类型的其他(后来“样式化”,显然不是以前的)实例。我需要确保仅对一个单独的实例进行更改(不影响任何其他对象)。示例 - 使用了JButton,但遇到了同样的问题,例如JTabbedPane 和自定义画家:
-
button 1- 属性 A(内容边距)已自定义。 -
button 2- 仅自定义属性 B(字体) - 但属性 A 的变化也可见(更大的 manrgins),“以某种方式继承”自button 1。 -
button 3- 没有自定义属性(使用空属性映射) - 两个更改 (A+B) 似乎都是从button1和button2继承的(更大的边距,更大的字体) -
button 4- 默认外观 o JButton(无自定义)import java.awt.FlowLayout; import java.awt.Font; import java.awt.Insets; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.UIDefaults; public class NimbusPerComponentTest extends JFrame { public NimbusPerComponentTest() { super("Test"); setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); setLayout(new FlowLayout()); // 4 buttons to test JButton button1 = new JButton("Button 1"); JButton button2 = new JButton("Button 2"); JButton button3 = new JButton("Button 3"); JButton button4 = new JButton("Button 4"); add(button1); add(button2); add(button3); add(button4); pack(); // style // button 1 UIDefaults overrides1 = new UIDefaults(); overrides1.put("Button.contentMargins", new Insets(10,10,10,10)); button1.putClientProperty("Nimbus.Overrides", overrides1); // button 2 UIDefaults overrides2 = new UIDefaults(); overrides2.put("Button.font", new Font("Sans Serif", Font.BOLD, 15)); button2.putClientProperty("Nimbus.Overrides", overrides2); // button 3 UIDefaults overrides3 = new UIDefaults(); // nothing = left empty button3.putClientProperty("Nimbus.Overrides", overrides3); // button 4 // no styling } public static void main(String args[]) { try { for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) { if ("Nimbus".equals(info.getName())) { javax.swing.UIManager.setLookAndFeel(info.getClassName()); break; } } } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | javax.swing.UnsupportedLookAndFeelException ex) { java.util.logging.Logger.getLogger(NimbusPerComponentTest.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); } java.awt.EventQueue.invokeLater(new Runnable() { public void run() { new NimbusPerComponentTest().setVisible(true); } }); } }
知道为什么吗?我错过了什么?任何优雅的解决方法? (Java 8、Windows 10)
编辑
在一些答案的启发下:
尝试在我的原始代码末尾重置外观(设置为 null 并再次返回到 Nimbus,包括 SwingUtilities.updateComponentTreeUI),唯一的结果是:
现在即使是 button4 也被画错了(边距和字体都改变了),尽管通用默认值从未被触及......奇怪。
编辑 2
我设法找到了一个单行解决方法/hack。看看我自己对我的问题的回答......
【问题讨论】:
标签: java swing look-and-feel nimbus