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());
}
① 凡本网注明稿件来源为"原创"的所有文字、图片和音视频稿件,版权均属本网所有。任何媒体、网站或个人转载、链接转贴或以其他方式复制发表时必须注明"稿件来源:我考网",违者本网将依法追究责任;
② 本网部分稿件来源于网络,任何单位或个人认为我考网发布的内容可能涉嫌侵犯其合法权益,应该及时向我考网书面反馈,并提供身份证明、权属证明及详细侵权情况证明,我考网在收到上述法律文件后,将会尽快移除被控侵权内容。