AWT与Swing
使用区别
使用Swing组件创建程序是因为它比AWT更为专业,而且Swing提供了更多的附加元素。比如说,通过Swing的JEditorPane组件可以在Java程序中使用HTML格式文本。而AWT实现同样功能不但困难,而且要花费相当多的时间。
Swing并不一定能使程序更容易床加你,但是可以使程序更加美观,而且容易在其他平台上运行。Swing组件一般比AWT组件强大得多。
AWT类分为两部分。一部分可以安全的混入Swing类(如表Ⅰ);另一部分要用Swing的等价类对其替换(如表Ⅱ)。
表Ⅰ 可以与swing安全共存的AWT组件
类型 | 特殊类 |
所有现有的布局管理器 | BorderLayout,CardLayout,FlowLayout,GridLayout,GridBagLayout |
Java.awt.event包中所有的事件、监听器和适配器 | ActionEvent,ActionListener,WindowEvent.WindowListener,WindowAdapter等 |
所有非GUI存储容器 | Dimension,Insects,Point,Polygon,Rectangle |
提供访问系统资源的类 | Color,Cursor,Font,FontMetrics,SystemColor和Toolkit |
与图像相关的类 | Graphics,Graphics2D,Image,MediaTracker |
表Ⅱ AWT类和Swing相对应的组件
AWT组件 | Swing组件 | 备注 |
Applet | JApplet | 不使用add()方法而是用 getContentPane().add; JApplet是javax.swing包下的类 |
Button | JButton | 代码兼容 |
Canvas | JPanel或JLabel | 用paintComponent取代paint(),JPanel和JLabel已经有了双缓冲 |
Checkbox | JCheckbox或JRadioButton | 代码兼容 |
CheckboxGroup | 取代ButtonGroup | ButtonGroup可以组合检查框、单选按钮和按钮 |
CheckboxMenuItem | JCheckboxMenuItem 和JRadioButtonMenuItem | 代码兼容 |
Choice | JComboBox | 项目的加入不同 |
Component | JComponent | 一般不直接使用 |
Dialog | JDialog or,JOptionPane | 不使用add方法而使用getContentPane().add |
FileDialog | JFileChooser | 不同 |
Frame | JFrame | 不使用add方法而使用getContentPane().add |
Label | JLabel | 代码兼容 |
List | JList | 列表需要独立的scroll pane和数据模型 |
Menu,MenuBar, MenuItem,PopupMenu | JMenu,JMenuBar,JMenuItem, JPopupMenu,JSeparator 和JPopupMenu.Separator | 代码兼容,但是separators是独立的类,不是成员变量 |
Panel | JPanel | 代码兼容 |
Scrollbar | JScrollBar或JSlider或JProgressBar | 取决于所使用的类 |
ScrollPane | JScrollPane | 代码兼容 |
TextArea | JTextArea | 必须手工加载scrollbars,事件监听器不同 |
TextComponent | JTextComponent | 不直接使用 |
TextField | JTextFiled | 代码兼容 |
Window | JWindow | 代码兼容,不常用 |
使用Swing编程需要注意:
1. 不要再一个程序中混合使用Swing和AWT GUI组件。原则上他们可以共存,但是可能会发生无法预料的情况。在使用GUI构件时,只用Swing组件可以减少问题发生。至少,应在最高层的容器中使用如JFrame或JApplet等Swing组件。然而,在Swing类中混合使用非GUI的AWT类不会引起任何问题。
2. 尽管AWT组件是线程安全的,但Swing GUI组件却不是。如果创建的程序的GUI元素要用到线程操作,就需要使用自己设置的同步机制。如当程序中使用线程操作一个列表的表项时,若用户也在做同样的事,这是必须执行同步机制,以避免破坏列表的完整性。