在默认情况下,Swing程序使用Metal观感,可以采用两种方式改变观感。
第一种方式是在Java安装的子目录jre/lib下有一个文件swing.properties。在这个文件中,将属性swing.defaultlaf设置为所希望的观感类名。例如,swing.defaultlaf=com.sun.java.swing.plaf.motif.MotifLookAndFeel
注意,Metal观感位于javax.swing包中。其他的观感包位于com.sun.java包中,并且不是在每个Java实现中都提供。现在,鉴于版权的原因,Windows和Mac的观感包只与Windows和Mac版本的Java运行时环境一起发布。
提示:由于属性文件中以#字符开始的行被忽略,所以,可以在swing.properties文件中提供几种观感选择,并通过增删#字符来切换选择
采用这种方式开启观感时必须重新启动程序。Swring程序只在启动时读取一次swing.properties文件。
第二种方式是动态地改变观感。这需要调用静态的UIManager.setLookAndFeel方法,并提供所想要的观感类名,然后再调用静态方法SwingUtilities.updateComponetTreeUI来刷新全部的组件集。这里需要向这个方法提供一个组件,并由此找到其他的所有组件。当UIManager.setLookAndFeel方法没有找到所希望的观感或在加载过程中出现错误时,将会抛出异常。
完整示例,演示如何切换观感方式:
import java.awt.EventQueue;
import java.awt.event.*;
import javax.swing.*;
public class PlafTest {
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
PlafFrame frame = new PlafFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
});
}
}
final class PlafFrame extends JFrame {
public PlafFrame() {
setTitle("PlafTest");
setSize(DEFAULT_WIDTH, DEFALUT_HEIGHT);
buttonPanel = new JPanel();
UIManager.LookAndFeelInfo[] infos = UIManager.getInstalledLookAndFeels();
for (UIManager.LookAndFeelInfo info : infos) {
makeButton(info.getName() + "-" + info.getClassName(), info.getClassName());
}
add(buttonPanel);
}
void makeButton(String name, final String plafName) {
// add button to panel
JButton button = new JButton(name);
buttonPanel.add(button);
// set button action
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent event) {
// button action: switch to the new look and feel
try {
UIManager.setLookAndFeel(plafName);
SwingUtilities.updateComponentTreeUI(PlafFrame.this);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
private JPanel buttonPanel;
public static final int DEFAULT_WIDTH = 300;
public static final int DEFALUT_HEIGHT = 200;
}
演示结果:
Metal:
Nimbus:
CDE/Motif:
Windows:
Windows Classic: