Java 改變觀感

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章