8.7 设置Swing界面的外观(look)和感觉(feel)
我们知道,AWT组件不能跨平台,它的外观显示取决于程序运行时所在的操作系统,如果程序在Windows操作系统中运行,就会显示Windows操作系统组件的外观;如果程序在Linux操作系统中运行,就会显示Linux操作系统组件的外观。但其后的Swing包中提供的组件则 支持跨平台,可以保证使用Swing组件开发的GUI程序在不同的操作系统中呈现一致的界面效果。
在Swing中,采用UIManager类来管理Swing界面的外观,UIManager类提供的方法均为静态方法,因此,无需生成UIManager的类对象来调用,一般使用静态方法setLookAndFeel来设置界面的外观及感觉,该方法是一个重载方法,提供两个重载形式。
setLookAndFeel(LookAndFeel newLookAndFeel)
setLookAndFeel(String className)
其中参数newLookAndFeel表示组件的某种外观,className表示组件某种外观的名字。
可以通过如下三种方式设置Swing组件的外观和观感。
(1)采用程序所在当前系统的组件外观
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
这样,实际上与AWT组件呈现的效果一样,在不同的操作系统上显示不同的外观。
(2)在所有操作系统中保持同样的跨平台的Metal外观,这也是UIManager采用的默认的外观。本节前的所有Swing应用程序采用的都是这种外观。
(3)指定某种特定外观
JDK1.6版本中默认支持如下五种外观:
javax.swing.plaf.metal.MetalLookAndFeel
com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel
com.sun.java.swing.plaf.motif.MotifLookAndFeel
com.sun.java.swing.plaf.windows.WindowsLookAndFeel
com.sun.java.swing.plaf.windows.WindowsClassicLookAndFeel
读者可以通过UIManager.setLookAndFeel("XXX")的方式设置:
下面的例子演示了在同一个GUI程序中采用不同外观设置时其显示效果。
[例8-13]
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
class LookAndFeelTest extends JFrame{
private JRadioButton rdo1 = new JRadioButton("Metal");
private JRadioButton rdo2 = new JRadioButton("Windows");
private JRadioButton rdo3 = new JRadioButton("Nimbus");
private JRadioButton rdo4 = new JRadioButton("Motif");
private JPanel panelNorth = new JPanel();
private JPanel panelSouth= new JPanel();
private JTextArea area = new JTextArea(6,20);
private JButton btn = new JButton("JButton按钮");
private JCheckBox chk = new JCheckBox("复选框");
private JComboBox cmbCity= new JComboBox(new String[]{"北京","上海","广州","深圳"});
public LookAndFeelTest(String title){
super(title);
Container contentPane = this.getContentPane();
ButtonGroup group = new ButtonGroup();
group.add(rdo1);
group.add(rdo2);
group.add(rdo3);
group.add(rdo4);
panelNorth.add(rdo1);
panelNorth.add(rdo2);
panelNorth.add(rdo3);
panelNorth.add(rdo4);
panelSouth.add(btn);
panelSouth.add(chk);
panelSouth.add(cmbCity);
contentPane.add(panelNorth,BorderLayout.NORTH );
contentPane.add(area,BorderLayout.CENTER );
contentPane.add(panelSouth,BorderLayout.SOUTH );
pack();
setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//监听Item事件
rdo1.addItemListener(new MyItemListener());
rdo2.addItemListener(new MyItemListener());
rdo3.addItemListener(new MyItemListener());
rdo4.addItemListener(new MyItemListener());
} [NextPage]
private class MyItemListener implements ItemListener{
public void itemStateChanged(ItemEvent e) {
//取得点击按钮的名字
String itemName= ((JRadioButton)e.getSource()).getText();
changeLookAndFeel(itemName);
}
}
//设置外观的private类型方法
private void changeLookAndFeel(String name){
String lookName="";
if(name.equals("Metal")){
lookName="javax.swing.plaf.metal.MetalLookAndFeel";
}
if(name.equals("Windows")){
lookName="com.sun.java.swing.plaf.windows.WindowsLookAndFeel";
}
if(name.equals("Nimbus")){
lookName="com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel";
}
if(name.equals("Motif")){
lookName="com.sun.java.swing.plaf.motif.MotifLookAndFeel";
}
try{
UIManager.setLookAndFeel(lookName);
//下面这句话必须有 ,否则外观不会发生变化
SwingUtilities.updateComponentTreeUI(this);
area.setText("当前外观类名:\n"+lookName);
}
catch(Exception ex){
ex.printStackTrace();
}
}
}
public class Test8_13 {
public static void main(String[] args) {
new LookAndFeelTest("java的外观测试");
}
}
运行结果如下图

图8-17 例8-13四种外观的显示效果
| 广告合作:400-664-0084 全国热线:400-664-0084 Copyright 2010 - 2017 www.my8848.com 珠峰网 粤ICP备15066211号 珠峰网 版权所有 All Rights Reserved
|