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