1.swing的特性
l 是AWT的扩展,swing比AWT提供了更多的组件和外观
l 它是纯java代码编写(除了JFrame、JDialog、JApplet),因此与平台无关
2.AWT的缺点
组件少而且是本地代码实现(无法实现跨平台)
3.swing 和 AWT相比
一个重要的的改进在于swing把一个组件的处理分为图形部分和数据处理部分(MVC模型)
l 图形部分由编程环境统一处理(View)
l 数据部分由一个数据处理模型进行处理(Model)
4.swing编程应注意的问题
l swing和AWT组件不要混合使用,可能会导致不能正常显示的错误
l 正确理解轻量级组件与重量级组件的不同
轻量级组件——swing组件,由纯java代码实现,占用系统资源少
重量级组件——AWT组件,有本地c代码实现,占用系统资源多
(注:JFrame、JDialog、JApplet(顶层容器)是重量级组件)
1.swing中常见的“LookAndFeel”
l Metal风格 (默认)
javax.swing.plaf.metal.MetalLookAndFeel
l Windows风格
com.sun.java.swing.plaf.windows.WindowsLookAndFeel
l Windows Classic风格
com.sun.java.swing.plaf.windows.WindowsClassicLookAndFeel
l Motif风格
com.sun.java.swing.plaf.motif.MotifLookAndFeel
l Mac风格 (需要在相关的操作系统上方可实现)
com.sun.java.swing.plaf.mac.MacLookAndFeel
l GTK风格 (需要在相关的操作系统上方可实现)
com.sun.java.swing.plaf.gtk.GTKLookAndFeel
l 可跨平台的默认风格
UIManager.getCrossPlatformLookAndFeelClassName()
l 当前系统的风格
UIManager.getSystemLookAndFeelClassName()
意义:通过LookAndFeel机制,我们可以是程序的设计者任意转换程序的人机界面来对应不同的操作系统
2.设置swing的LookAndFeel
在swing中,采用UIManager类来管理swing界面的LookAndFeel,UIManager类提供静态方法setLookAndFeel()来设置界面的LookAndFeel,该方法是一个重载方法,提供两个重载方式:
setLookAndFeel(LookAndFeel newLookAndFeel)
setLookAndFeel( String className)
其中:参数newLookAndFeel表示组件的某种外观,className表示组件某种外观的名字
2-1.设置方法(静态设置,动态设置)
静态设置——设计时指定LookAndFeel
eg1:
String lookAndFeel = "javax.swing.plaf.metal.MetalLookAndFeel";
UIManager.setLookAndFeel(lookAndFeel);
eg2:
String lookAndFeel = UIManager.getCrossPlatformLookAndFeelClassName();
UIManager.setLookAndFeel(lookAndFeel);
动态设置——运行时指定LookAndFeel
eg:
UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName());
//运行时动态更新外观
SwingUtilities.updateComponentTreeUI(this)
附:SwingUtilities.updateComponentTreeUI(Component c)
对组件c重新设置外观
注:由于JFrame、JDialog、JApplet(顶层容器)为重量级组件,因此他们的外观只与操作系统平台有关系,在相同的操作系统平台下表现相同的外观
2-2.程序代码
import java.awt.*; import java.awt.event.*; import javax.swing.*; public class LookAndFeelDemo2 extends JFrame { private JRadioButton radio1 = new JRadioButton("Metal"); private JRadioButton radio2 = new JRadioButton("Windows"); private JRadioButton radio3 = 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("button"); private JCheckBox chk = new JCheckBox("checkBox"); private JComboBox cmbLookAndFeel = new JComboBox(new String[] { "Metal", "Widows", "Motif", "GTK" }); public LookAndFeelDemo2(String title) { super(title); Container contentPane = this.getContentPane(); ButtonGroup group = new ButtonGroup(); group.add(radio1); group.add(radio2); group.add(radio3); panelNorth.add(radio1); panelNorth.add(radio2); panelNorth.add(radio3); panelSouth.add(btn); panelSouth.add(chk); panelSouth.add(cmbLookAndFeel); contentPane.add(panelNorth, BorderLayout.NORTH); contentPane.add(area, BorderLayout.CENTER); contentPane.add(panelSouth, BorderLayout.SOUTH); pack(); setVisible(true); setSize(300, 400); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 监听Item事件 radio1.addItemListener(new MyItemListener()); radio2.addItemListener(new MyItemListener()); radio3.addItemListener(new MyItemListener()); } 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 lookAndFeel = ""; if (name.equals("Metal")) { lookAndFeel = "javax.swing.plaf.metal.MetalLookAndFeel"; } else if (name.equals("Windows")) { lookAndFeel = "com.sun.java.swing.plaf.windows.WindowsLookAndFeel"; } else if (name.equals("Motif")) { lookAndFeel = "com.sun.java.swing.plaf.motif.MotifLookAndFeel"; }else{ //取得默认的metal外观 lookAndFeel = "javax.swing.plaf.metal.MetalLookAndFeel"; } try { UIManager.setLookAndFeel(lookAndFeel); // 运行时指定LookAndFeel,需要SwingUtilities.updateComponentTreeUI(Component // c)实现动态的更新 SwingUtilities.updateComponentTreeUI(this); area.setText("当前外观类名:\n" + lookAndFeel); } catch (Exception ex) { ex.printStackTrace(); } } public static void main(String[] args) { new LookAndFeelDemo2("LookAndFeel"); } }
1.swing组件的分类
2.往swing容器里添加组件
对于swing顶层容器(JFrame,JDialog,JApplet),在添加组件时,不能直接调用容器的add()方法。
往顶层容器添加组件可用以下方法:
a) 通过getContentPane()方法获得当前容器的内容面板对象,在调用容器的add()方法加入各个组件
b) 先利用JPanel类生成一个内容面板对象panel,再将各个组件加入到panel中,然后调用的容器的setContentPane()方法,将panel加入到当前容器中
3.使用swing组件的基本规则
a) 把swing组件放入一个顶层容器中
b) 避免使用非swing的重量级组件
c) 往swing顶层容器添加组件时,不能直接调用add()方法
d) 内容面板缺省的布局策略是BorderLayout,不能对顶层容器进行布局
a) Swing组件可以产生AWT包中的事件
b) 有自己的事件包(javax.swing.event)
c) Component类的五种事件
d) 能激活Container类的ContainerEvent事件的Swing组件
Swing组件中的容器(如:JFrame, JPane)
复合组件(如:JComboBox)