使用Swing来开发图形界面比AWT更加优秀,因为Swing是一种轻量级组件,它采用100%的java实现,不再依赖于本地平台的图形界面,所以可以在所有平台上保持相同的运行效果,对跨平台支持比较出色。
除此之外,Swing提供了比AWT更多的图形界面组件,因此可以开发出更美观的图形界面程序。由于AWT需要调用底层平台的GUI实现,所以AWT只能使用各种平台上GUI组件的交集,这大大限制了AWT所支持的GUI组件。对Swing而言,几乎所有组件都采用纯java实现,所以无须考虑底层平台是否支持该组件,因此Swing可以提供如JTabbedPane,JDesktopPane,JInternalFrame等特殊容器,也可以提供像JTRee,JTable,JSinner,JSlider等特殊的GUI组件。
除此之外,Swing组件都采用MVC的设计,从而可以试下GUI组件的显示逻辑和数据逻辑的分离,从而允许程序员自定义Render来改变GUI组件的显示外观,提供更多的灵活性。
前一章已经介绍过AWT和Swing的关系,因此我们知道:实际使用java进行图形界面程序时,很少使用AWT组件,绝大部分时候都是用Swing组件来进行开发。Swing是由100%纯java实现的,不再依赖于本地平台的GUI,因此可以在所有平台上都保持相同的界面外观。独立于本地平台的Swing组件被称为轻量级组件;而依赖于本地平台的AWT组件被称为重量级组件。
由于Swing的所有组件完全采用java实现,不再调用本地平台的GUI,所以导致Swing图形界面的组件显示速度要比AWT图形界面的显示速度慢一些,但相对于快速发展的硬件设施而言,这种微小的速度差别无妨大碍。
使用Swing开发图形界面有如下几个优势:
Swing提供的这些优势,让java图形界面程序真正实现了“Write Once,Run Anywhere”的目标。除此之外,Swing还有如下两个特征:
Swing提供了一种独立于各种平台的Metal风格的外观,也被称为java风格的外观。早期的Metal风格的外观比较单调,从JDK1.5以后,Metal风格的外观吸收了Macintosh平台的风格,提供了一种被称为Ocean主题的外观,从而让Swing图形界面看上去非常美观。
前面已经提到,Swing为所有AWT组件提供了对应实现(除了Canvas组件之外,因为再Swing中无须继承Canvas组件),通常在AWT组件的组件名前增加“J”就变成了对应的Swing组件。
大部分Swing组件都是JComponent抽象类的直接或间接子类(并不是全部Swing组件都是),JComponent类定义了所有子类组件的通用方法,JComponent类是AWT里java.awt.Container类的子类,这也是AWT和Swing的联系之一。绝大部分Swing组件类继承了Container类,所以Swing组件都可作为容器使用(JFrame继承了Frame类)。
注意:
Swing中包含了四个组件直接继承了AWT组件,而不是从JComponent派生出来的,它们分别是:JFrame,JWindow,JDialog和JApplet,它们并不是轻量级组件,而是重量级组件(需要部分委托给运行平台上GUI组件的对等体)。
将Swing组价按功能来分,又可分为如下几类:
Swing为除了Canvas之外的所有AWT组件提供了相应的实现,Swinng组件比AWT组件的功能更加强大。相对于AWT组件,Swing组件有如下四个额外的功能:
JColorChooser用于创建一个颜色选择器对话框,该类的用法非常简单,该类主要提供了如下两个静态方法:
通过JOptionPane可以非常方便地创建一些简单的对话框,Swing已经为这些对话框添加了相应的组件,无须程序手动添加组件。
JOptionPane产生的所有对话框都是模式的,在用户完成与对话框的交互之前,showXxxDialog方法都将一直阻塞当前线程。
输入区
如果创建的对话框无须接受用户输入,则输入区不存在,输入区组件可以是普通文本框组件,也可以是下拉列表框组件。
如果调用该方法时指定了一个数组类型的selection Values参数,则输入区包含了一个下拉列表组件。
图标区
左上角的图标会随创建的对话框所包含消息类型不同而不同,JOptionPane可以提供如下五种消息类型:
消息区
不管是哪种对话框,其消息区总是存在的,消息区的内容通过message参数来指定,根据message参数的类型不同,消息区显示的内容也是不同的,该message参数可以是如下几种类型:
大部分时候对话框的消息区都是普通能够字符串,但使用Component作为消息区组件则更加灵活,因为该Component参数几乎可是任何对象,从而可以让对话框的消息区包含任何内容。
按钮区
对话框底部的按钮区也是一定存在的,但所包含的按钮则会随对话框的类型,选项类型而改变。对于调用showInputDialog和showMessageDialog方法来得到的对话框,底部总是包含“确定”和“取消”两个标准按钮。
对于showConfirmDialog所打开的确认对话框,则可以指定一个整数类型的optiionType参数。
Swing提供了一些具有特殊功能的容器,这些特殊容器可以用于创建一些更复杂的用户界面。
SplitPane用于创建一个分割面板,它可以将一个组件(通常是一个容器)分隔成两个部分,并提供一个分割条,用户可以拖动该分割条来调整两个部分的大小。
分割面板的实质是一个特殊容器,该容器只能容纳两个组件,而且分隔面板又分为上下分隔,左右分隔两种情形。
JTabbedPane可以很方便地在窗口上放置多个标签页,每个标签页相当于获得了一个与外部容器相同大小的组件摆放区域。通过这种方式,就可以在一个容器里放置更多组件,例如我们右击桌上“我的电脑”图标,然后在弹出菜单里单击“属性”菜单项,就可以看到一个“系统属性”对话框,这个对话框里就包含了7个标签页。
拖放操作是非常常见的操作,我们经常会通过拖放操作来完成复制,剪切的功能,但这种复制,剪切操作无须剪切板支持,程序将数据从拖放源直接传给拖放目标。这种通过拖放实现的复制,剪切效果也被称为复制,移动。
当我们在拖放源中选中一项或多项元素后然后可以用鼠标将这些元素拖离它们的初始位置,当我们拖着这些元素在拖放目标上松开鼠标按键时,拖放目标将会查询托房源,进而访问到这些元素的相关信息,并会相应地启动一些动作。例如从Windows资源管理器里把一个文件图标拖放到winpad图标上,那winpad将会打开该文件。如果在Eclipse选中一段代码,然后将这段代码拖放到另一个位置,系统将会把这段代码从初始位置删除,并将这段代码放到拖放的目标位置。
除此之外,拖放操作还可以与三种组合键组合使用,用以完成特殊功能: