5.21.2008

Swing感官切换

在默认的情况下,Swing 程序使用Metal观感,可以采用两种方法改变观感。

第一种方式是在Java的安装的子目录下jre / lib有一个文件swing.properties。在这个文件中,将属性Swing.defaultlaf设置为所希望的观感类名。例如:

swing.defaultlaf = com.sun.java.swing.plaf.motif.MotifLookAndFeel

ps:第一中方式我怎么也没找到那个swing.properties,不知大家的如何?

注意,Metal观感位于Javax.swing包中。其他的观感包位于com.sun.java包中,并且不是在每个Java实现中都提供。现在,鉴于版权的原因,Windows 和Mac 的观感包只与Windows和Mac版本的java运行环境一起发布。

提示:下面给出一个测试很有帮助的的建议。由于属性文件中的以#字符开始的行被忽略,所以,可以在swing.properties文件中提供几种观感,并同过增删#字符来切换选择:

#swing.defaultlaf = javax.swing.plaf.metal.MetalLookAndFeel

swing.defaultlaf = com.sun.java.swing.plaf.motif.MotifLookAndFeel

#swing.defaultlaf = com.sun.java.swing.plaf.windows.WindowsLookAndFeel

采用这种方式开启观感时必须重新启动程序。Swing程序只在启动时读取一次swing.properties文件。

第二种方式是动态地改变观感。这需要调用静态的UIManager.setLookAndFeel方法,并提供所想要的观感类名,然后再调用静态方法 SwingUtilities.updateComponentTreeUI来刷新全部的组件集。这里需要向这个方法提供一个组件,并由此找到其他的所有组件。当UIManager.setLookAndFeel方法没有找到所希望的观感或在加载过程中出现错误时,将会抛出异常。

下面是一个例子,他显示了如何在程序中切换观感的方式。在这个程序中,这有点需要注意的地方。在内部动作监听器类的actionPerformed方法中,需要将一个外部的PalfPanel类的this引用传递给updateComponentTreeUI方法。
java 代码

1. import java.awt.*;
2. import java.awt.event.*;
3. import javax.swing.*;
4.
5.
6. public class PlafTest {
7.
8. public static void main(String[] args) {
9. // TODO Auto-generated method stub
10. PlafFrame frame = new PlafFrame();
11. frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
12. frame.setVisible(true);
13.
14. }
15. }
16.
17. //A Frae with a button panel for chaing look and fell
18. class PlafFrame extends JFrame {
19.
20. public static final int DEFAULT_WIDTH = 300;
21. public static final int DEFAULT_HEITHT =200;
22.
23. public PlafFrame(){
24.
25. setTitle("PlaF Test");
26. setBounds(350,250,DEFAULT_WIDTH,DEFAULT_HEITHT);
27. PlafPanel panel = new PlafPanel();
28. add(panel);
29. }
30.
31. }
32.
33. //A panel with buttons to change the pluggable look and fell
34.
35. class PlafPanel extends JPanel {
36. public PlafPanel(){
37. UIManager.LookAndFeelInfo[] infos = UIManager.getInstalledLookAndFeels();
38. for(UIManager.LookAndFeelInfo info : infos)
39. makeButton(info.getName(),info.getClassName());
40.
41.
42. }
43.
44. void makeButton(String name,final String plafName){
45.
46. //add button to panel
47.
48. JButton button = new JButton(name);
49. add(button);
50.
51. //set button action
52.
53. button.addActionListener(new
54. ActionListener(){
55. public void actionPerformed(ActionEvent event){
56.
57. //button action :switch to the new look and feel
58. try{
59. UIManager.setLookAndFeel(plafName);
60. SwingUtilities.updateComponentTreeUI(PlafPanel.this);
61.
62. }
63. catch(Exception e){e.printStackTrace();}
64.
65. }
66.
67. });
68. }
69.
70.
71. }

没有评论: