是否可以更改任何Windows桌面属性外观?

时间:2015-03-06 07:45:45

标签: java swing java-8 look-and-feel uimanager

在我工作的公司,我们从sun.awt.WToolkit派生了一个类,通过调用setDesktopProperty()来改变一些颜色。多年来一直运作良好。但是现在在JDK 8中,WToolkit是最终的,不能被子类化。简单的方法可能是做一些讨厌的反射并调用受保护的方法,虽然我不确定这不会产生安全异常或类似的东西。

正确的方法是通过外观改变这些颜色。 Windows Desktop Property Support中的Oracle声明

程序不需要直接访问这些属性; Windows外观将自动读取和解释这些属性,以便为组件提供适当的视觉效果和行为。

但它没有说明通过LaF修改自定义这些属性的任何内容,当然UIManager.put("win.3d.shadowColor", Color.gray);正如this doc中提到的那样无效。

所以我的问题是,可以通过继承现有的外观来改变Windows桌面属性,还是应该采用某种方法?

1 个答案:

答案 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);