当前位置:文档之家› 简述Java图形用户界面设计(Swing)

简述Java图形用户界面设计(Swing)

简述Java图形用户界面设计(Swing)Swing是一个用于开发Java应用程序用户界面的开发工具包。

它以抽象窗口工具包(AWT)为基础使跨平台应用程序可以使用任何可插拔的外观风格。

Swing开发人员只用很少的代码就可以利用Swing丰富、灵活的功能和模块化组件来创建优雅的用户界面。

作为一个Java 程序员,从论坛上感受到使用Java 开发程序的人越来多,心中不免欣慰。

但是,同样是从论坛中,看到多数人提到Java 就以为是网络开发——不是这样的,Java 也可以开发应用程序,而且可以开发出漂亮的图形用户界面的应用程序,也就是Windows/XWindow 应用程序。

因此,我写下这篇文章,希望能带你进入Java 图形用户界面设计之门。

下面,让我们开始……说明:所有代码均在Windows XP + Eclipse 环境下编写和测试,示例图片均在Windows XP 下捕捉。

目录一. AWT 和Swing二. 框架、监听器和事件三. 按钮、切换按钮、复选按钮和单选按钮四. 文本输入框、密码输入框五. 窗格、滚动窗格和布局管理六. 后记——什么是SWT (2006年补充)一. AWT 和SwingAWT 和Swing 是Java 设计GUI 用户界面的基础。

与AWT 的重量级组件不同,Swing 中大部分是轻量级组件。

正是这个原因,Swing 几乎无所不能,不但有各式各样先进的组件,而且更为美观易用。

所以一开始使用AWT 的程序员很快就转向使用Swing 了。

那为什么AWT 组件没有消亡呢?因为Swing 是架构在AWT 之上的,没有AWT 就没有Swing。

所以程序员可以根据自己的习惯选择使用AWT 或者是Swing。

但是,最好不要二者混用——除开显示风格不同不说,还很可能造成层次(Z-Order) 错乱,比如下例:1/*2 * AwtSwing.java3 * @author Fancy4 */56import java.awt.BorderLayout;7import java.awt.Button;89import javax.swing.JButton;10import javax.swing.JDesktopPane;11import javax.swing.JFrame;12import javax.swing.JInternalFrame;13import javax.swing.JPanel;1415public final class AwtSwing {1617public static void main(String[] args) {18 AwtSwing as = new AwtSwing();19 as.show();20 }2122 JFrame frame = new JFrame("Test AWT and SWING");2324 JDesktopPane jdp = new JDesktopPane();2526 JInternalFrame jif1 = new JInternalFrame("controls");2728 JInternalFrame jif2 = new JInternalFrame("cover");2930public AwtSwing() {31 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);32 frame.getContentPane().add(jdp);3334 jif1.setContentPane(new JPanel());35 jif2.setContentPane(new JPanel());3637 jif1.getContentPane().setLayout(new BorderLayout());38 jif1.getContentPane().add(new Button("AWT Button"), BorderLayout.WEST);39 jif1.getContentPane().add(new JButton("Swing Button"),40 BorderLayout.EAST);4142 jif1.setSize(200, 100);43 jif2.setSize(200, 100);4445 jdp.add(jif1);46 jdp.add(jif2);4748 frame.setSize(240, 140);49 }5051public void show() {52 frame.setVisible(true);53 jif1.setVisible(true);54 jif2.setVisible(true);55 }5657}运行这个程序,并用鼠标拖动那个名为“cover”的子窗口,我们会发现一个非常有趣的现象,如图:显然cover 子窗口是在controls 子窗口之上的,但是它只罩盖住了Swing Button,没有罩盖住AWT Button。

再看一会儿,你是不是有这样一种感觉:Swing Button 是“画”上去的,而AWT Button 则是“贴”上去的。

这就是二者混用造成层次错乱的一个例子。

Swing 组件有美观、易用、组件量大等特点,也有缺点——使用Swing 组件的程序通常会比使用AWT 组件的程序运行更慢。

但是大家都还是更喜欢用Swing 组件,原因何在?因为随着计算机硬件的升级,一点点速度已经不是问题。

相反的,用户更需要美观的用户界面,开发人员则更需要易用的开发组件。

二. 框架、监听器和事件框架(Frame, JFrame) 是Java 图形用户界面的基础,它就是我们通常所说的窗口,是Windows/XWindow 应用程序的典型特征。

说到Windows/XWindow,大家很容易联想到“事件(Event) 驱动”。

Java 的图形用户界面正是事件驱动的,并且由各种各样的监听器(Listener) 负责捕捉各种事件。

如果我们需要对某一个组件的某种事件进行捕捉和处理时,就需要为其添加监听器。

比如,我们要在一个窗口(JFrame) 激活时改变它的标题,我们就需要为这个窗口(JFrame 对象) 添加一个可以监听到“激活窗口”这一事件的监听器——WindowListener。

怎么添加监听器呢?这通常由组件类提供的一个addXxxxxListener 的方法来完成。

比如JFrame 就提供有addWindowListener 方法添加窗口监听器(WindowListener)。

一个监听器常常不只监听一个事件,而是可以监听相关的多个事件。

比如WindowListener 除了监听窗口激活事件(windowActivate) 之外,还可以监听窗口关闭事件(windowClosing) 等。

那么这些事件怎么区分呢?就靠重载监听器类(Class) 的多个方法(Method) 了。

监听器监听到某个事件后,会自动调用相关的方法。

因此我们只要重载这个方法,就可以处理相应的事件了。

不妨先看一个例子:58/**59 * @(#) TestFrame.java60 * @author James61 */6263import javax.swing.*;64import java.awt.event.*;6566public class TestFrame extends JFrame {6768private int counter = 0;6970public TestFrame() {71 /* 使用匿名类添加一个窗口监听器 */72 addWindowListener(new WindowAdapter() {73public void windowClosing(WindowEvent e) {74 System.out.println(75 "Exit when Closed event");76 //退出应用程序77 System.exit(0);78 }7980public void windowActivated(WindowEvent e) {81 // 改变窗口标题82 setTitle("Test Frame " + counter++);83 }84 });8586 // 设置窗口为固定大小87 setResizable(false);88 setSize(200, 150);89 }9091public static void main(String[] args) {92 TestFrame tf = new TestFrame();93 tf.show();94 }9596}这个例子中,我们设计了一个窗口类(public class TestFrame extends JFrame { ... }),并且为这个窗口添加了一个窗口监听器(addWindowListener(new WindowAdapter() ...)。

而我们添加的这个窗口监听器主要监听了两个事件:窗口关闭(public void windowClosing(WindowEvent e) ...) 和窗口激活(public void windowActivated(WindowEvent e) ...)。

在窗口关闭事件中我们退出了整个应用程序(System.exit(0);),而在窗口激活事件中,我们改变了窗口的标题(setTitle("Test Frame " + counter++);)。

最后,我们在main 方法中显示了这窗口类的一个实例,运行得到下图所示的结果:这个程序的运行结果就是一个什么东西都没有加的框架,也就是一个空窗口。

那么,你知道显示一个窗口最主要的几句代码吗?不知道没关系,我来告诉你,显示一个窗口只需要做三件事:生成实例(对象)→设置大小→显示,相应的,就是下面的三句代码:97JFrame frame = new JFrame("Frame's Title");98frame.setSize(400, 300);99frame.setVisible(true);也许你会说:第一句的意思我清楚,第三句的意思我也明白,为什么一定要第二句呢?其实想想也就明白了,叫你画一个没法有大小的矩形你能画出来吗?不能。

同样,没有大小的窗口,怎么显示?所以我们需要用setSize(int width, int height) 方法为其设置大小。

相关主题