AWT与Swing施用区别
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元素要用到线程操作,就需要使用自己设置的同步机制。如当程序中使用线程操作一个列表的表项时,若用户也在做同样的事,这是必须执行同步机制,以避免破坏列表的完整性。