在默認情況下,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: