在我工作的公司,我们从sun.awt.WToolkit
派生了一个类,通过调用setDesktopProperty()
来改变一些颜色。多年来一直运作良好。但是现在在JDK 8中,WToolkit是最终的,不能被子类化。简单的方法可能是做一些讨厌的反射并调用受保护的方法,虽然我不确定这不会产生安全异常或类似的东西。
正确的方法是通过外观改变这些颜色。 Windows Desktop Property Support中的Oracle声明
程序不需要直接访问这些属性; Windows外观将自动读取和解释这些属性,以便为组件提供适当的视觉效果和行为。
但它没有说明通过LaF修改自定义这些属性的任何内容,当然UIManager.put("win.3d.shadowColor", Color.gray);
正如this doc中提到的那样无效。
所以我的问题是,可以通过继承现有的外观来改变Windows桌面属性,还是应该采用某种方法?
答案 0 :(得分:3)
Swing的Windows Look& Feel会将特定于Window的桌面属性导入其默认表中,但在此表中,使用标准的,与LaF无关的名称,这些名称通常由组件的名称和属性组成。
E.g:
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch(ClassNotFoundException|InstantiationException
|IllegalAccessException|UnsupportedLookAndFeelException ex) {
Logger.getLogger(LaFColors.class.getName()).log(Level.SEVERE, null, ex);
System.exit(1);
}
UIManager.put("Panel.background", Color.YELLOW);
UIManager.put("Button.foreground", Color.BLUE);
JFrame frame=new JFrame("Test");
frame.getContentPane().add(new JButton("See, it’s still "
+UIManager.getLookAndFeel().getName()+" LaF"), BorderLayout.NORTH);
frame.setSize(200, 200);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);