12.Swing编程

本章要点

  • Swing编程基础
  • Swing组件的继承层次
  • 常见Swing组件的用法
  • 使用JToolBar创建工具条
  • 颜色选择对话框和文件浏览对话框
  • Swing提供的特殊容器
  • java的拖放操作
  • Swing的简化拖放操作
  • Applet基础知识
  • 开发Applet的基本操作
  • 使用appletviewer浏览Applet
  • 开发进度条
  • 开发滑动条
  • 使用JTree和TreeModel开发树
  • 使用JTable和TableModel开发表格
  • 使用JTextPane工具

使用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组件的显示外观,提供更多的灵活性。

12.1 Swing概述

前一章已经介绍过AWT和Swing的关系,因此我们知道:实际使用java进行图形界面程序时,很少使用AWT组件,绝大部分时候都是用Swing组件来进行开发。Swing是由100%纯java实现的,不再依赖于本地平台的GUI,因此可以在所有平台上都保持相同的界面外观。独立于本地平台的Swing组件被称为轻量级组件;而依赖于本地平台的AWT组件被称为重量级组件。

由于Swing的所有组件完全采用java实现,不再调用本地平台的GUI,所以导致Swing图形界面的组件显示速度要比AWT图形界面的显示速度慢一些,但相对于快速发展的硬件设施而言,这种微小的速度差别无妨大碍。

使用Swing开发图形界面有如下几个优势:

  • Swing组件不再依赖于本地平台的GUI,无须采用各种平台的GUI交集,因此Swing提供了大量图形界面组件,远远超出了AWT所提供的图形界面组件集。
  • Swing组件不再依赖于本地平台GUI,因此不会产生与平台相关的bug。
  • Swing组件在各种平台上运行时可以保证具有相同的图形界面外观。

Swing提供的这些优势,让java图形界面程序真正实现了“Write Once,Run Anywhere”的目标。除此之外,Swing还有如下两个特征:

  • Swing组件遵守一种被称为MVC的设计模式,其中模型用于维护组件的各种状态,视图是组件的可视化表现,控制器用于控制对于各种事件,组件作出怎样的响应。当模型发生改变时,它会通知所有依赖它的视图,视图使用控件指定其相应机制。Swing使用UI代理来包装视图和控制器,还有另一个模型对象来维护该组件的状态。
  • Swing在不同的平台上表现一致,并且有能力提供本地平台不支持的显示外观。由于Swing组件采用MVC模式来维护各组件,所以当组件的外观被改变时,对组件的状态信息(由模型维护)没有任何影响,所以Swing可以使用插拔式外观感觉来控制组件外观,使得Swing图形界面在同一个平台上运行时能拥有不同的外观,用户可以选择自己习惯的外观。相比之下,由于控制组件外观的对等类与具体平台相关,因此AWT组件总是具有与本地平台相同的外观。

Swing提供了一种独立于各种平台的Metal风格的外观,也被称为java风格的外观。早期的Metal风格的外观比较单调,从JDK1.5以后,Metal风格的外观吸收了Macintosh平台的风格,提供了一种被称为Ocean主题的外观,从而让Swing图形界面看上去非常美观。

12.2 Swing基本组件的用法

前面已经提到,Swing为所有AWT组件提供了对应实现(除了Canvas组件之外,因为再Swing中无须继承Canvas组件),通常在AWT组件的组件名前增加“J”就变成了对应的Swing组件。

12.2.1 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组价按功能来分,又可分为如下几类:

  • 顶层容器:Jframe,JApplet,Jdialog和JWindow(几乎不会使用)。
  • 中间容器:JPenel,JScrollPane,JSplitPane,JToolBar等。
  • 特殊容器:在用户界面上具有特殊作用的中间容器,如JInternalframe
  • ,JRootPane,JLayeredPane和JDestopPane等。
  • 基本组件:实现人机交互的组件,如JButton,JComblBox,JList,JMenu,Jslider等。
  • 不可编辑信息的显示组件:向用户显示不可编辑信息的组件,如JLabel,JProgressBar和JToolTip等。
  • 可编辑信息的显示组件:向用户显示能被编辑的格式化信息的组件,如JTable,JTextArea和JtextField等。
  • 特殊对话框组件:可以直接产生特殊对话框的组件,如JColorChoosor和JFileChooser等。

12.2.2 AWT组件的Swing实现

Swing为除了Canvas之外的所有AWT组件提供了相应的实现,Swinng组件比AWT组件的功能更加强大。相对于AWT组件,Swing组件有如下四个额外的功能:

  • 可以为Swing组件设置提示信息,使用setToolTipText(),为组件你设置对用户有帮助的提示信息。
  • 很多Swing组件如按钮,标签,菜单项等,除了使用文字外,还可以使用图标修饰自己。为了允许在Swing组件中使用图标,Swing为Icon接口提供了一个实现类:imageIcon,该实现类代表一个图像图标。
  • 支持插拔式的外观风格,每个JComponent对象都有一个相应的ComponentUI对象,为它完成所有的绘画,事件处理,决定尺寸大小等工作。ComponentUI对象依赖当前使用的PLAF,使用UIManager.setLockAndFeel()方法可以改变图形界面的外观风格。
  • 支持设置边框:Swing组件可以设置一个或多个边框。Swing中提供了各式各样的边框供用户选用,也能建立组合边框或自己设计边框。一种空白边框可以用于增大组件,同时协助布局管理器对容器中的组件进行合理额布局。

12.2.3 使用JToolBar创建工具条

12.2.4 使用JColorChooser和JFileChooser

JColorChooser用于创建一个颜色选择器对话框,该类的用法非常简单,该类主要提供了如下两个静态方法:

  • showDialog():显示一个模式的颜色选择器对话框,该方法返回用户所选颜色。其中component指定该对话框的parent组件,而title指定该对话框的标题,大部分时候都使用该方法来让用户选择颜色。
  • createDialog():该方法返回一个对话框,该对话框内包含指定的颜色选择器,该方法可以指定该对话框是模式的,还是非模式的,还可以指定该窗口内“确定”按钮的事件监听器和“取消”按钮的事件监听器。

12.2.5 使用JOptionPane

通过JOptionPane可以非常方便地创建一些简单的对话框,Swing已经为这些对话框添加了相应的组件,无须程序手动添加组件。

  • showMessageDialog/showInternalMessageDialog:消息对话框,告知用户某事已发生,用户只能单击“确定”按钮,类似于“javaScript”中的alert函数。
  • showConfirmDialog/showInternalMessageDialog:确认对话框,向用户确认某个问题,用户可以选择yes,no,cancel等选项。类似于JavaScript的confirm函数。
  • showInputDialog/showInternalInputDialog:输入对话框,提示要求某些输入,类似于javaScript的prompt函数。
  • showOptionDialog/showInternalOptionDialog:自定义选项对话框,允许使用自定义选项的对话框,可以取代showConfirmDialog所产生的对话框,只是用起来更复杂。

JOptionPane产生的所有对话框都是模式的,在用户完成与对话框的交互之前,showXxxDialog方法都将一直阻塞当前线程。

输入区

如果创建的对话框无须接受用户输入,则输入区不存在,输入区组件可以是普通文本框组件,也可以是下拉列表框组件。

如果调用该方法时指定了一个数组类型的selection Values参数,则输入区包含了一个下拉列表组件。

图标区

左上角的图标会随创建的对话框所包含消息类型不同而不同,JOptionPane可以提供如下五种消息类型:

  • ERROR_MESSAGE:错误消息,其图标是一个红色的X图标。
  • INFORMATION_MESSAGE: 普通消息,其默认图标是蓝色的感叹号。
  • WARNINNG_MESSAGE:警告消息,其默认图标是黄色感叹号。
  • QUESTION_MESSAGE:问题消息,其默认图标是绿色问号。
  • PLAIN_MESSAGE: 普通消息,没有默认图标。

消息区

不管是哪种对话框,其消息区总是存在的,消息区的内容通过message参数来指定,根据message参数的类型不同,消息区显示的内容也是不同的,该message参数可以是如下几种类型:

  • String类型:系统将该字符串对象包装成JLabel对象,然后显示在对话框中。
  • Icon:该Icon被包装在JLablel后作为对话框的消息。
  • Component:将该Component在对话框的消息区总显示出来。
  • Object[]:对象数组被解释为在纵向排列的一系列message对象,每个message对象根据其实际类型又可以是字符串,图标,组件,对象数组等。
  • 其他类型:系统调用该对象的toString方法返回一个字符串,并将该字符串对象包装成JLabel对象,然后显示在对话框中。

大部分时候对话框的消息区都是普通能够字符串,但使用Component作为消息区组件则更加灵活,因为该Component参数几乎可是任何对象,从而可以让对话框的消息区包含任何内容。

按钮区

对话框底部的按钮区也是一定存在的,但所包含的按钮则会随对话框的类型,选项类型而改变。对于调用showInputDialog和showMessageDialog方法来得到的对话框,底部总是包含“确定”和“取消”两个标准按钮。

对于showConfirmDialog所打开的确认对话框,则可以指定一个整数类型的optiionType参数。

12.3 Swing中的特殊容器

Swing提供了一些具有特殊功能的容器,这些特殊容器可以用于创建一些更复杂的用户界面。

12.3.1 使用JSplitPane

SplitPane用于创建一个分割面板,它可以将一个组件(通常是一个容器)分隔成两个部分,并提供一个分割条,用户可以拖动该分割条来调整两个部分的大小。

分割面板的实质是一个特殊容器,该容器只能容纳两个组件,而且分隔面板又分为上下分隔,左右分隔两种情形。

12.3.2 使用JTabbedPane

JTabbedPane可以很方便地在窗口上放置多个标签页,每个标签页相当于获得了一个与外部容器相同大小的组件摆放区域。通过这种方式,就可以在一个容器里放置更多组件,例如我们右击桌上“我的电脑”图标,然后在弹出菜单里单击“属性”菜单项,就可以看到一个“系统属性”对话框,这个对话框里就包含了7个标签页。

12.4 Swing拖放功能

拖放操作是非常常见的操作,我们经常会通过拖放操作来完成复制,剪切的功能,但这种复制,剪切操作无须剪切板支持,程序将数据从拖放源直接传给拖放目标。这种通过拖放实现的复制,剪切效果也被称为复制,移动。

当我们在拖放源中选中一项或多项元素后然后可以用鼠标将这些元素拖离它们的初始位置,当我们拖着这些元素在拖放目标上松开鼠标按键时,拖放目标将会查询托房源,进而访问到这些元素的相关信息,并会相应地启动一些动作。例如从Windows资源管理器里把一个文件图标拖放到winpad图标上,那winpad将会打开该文件。如果在Eclipse选中一段代码,然后将这段代码拖放到另一个位置,系统将会把这段代码从初始位置删除,并将这段代码放到拖放的目标位置。

除此之外,拖放操作还可以与三种组合键组合使用,用以完成特殊功能:

  • 与Ctrl组合键组合使用:表示该拖放操作完成复制功能。
  • 与Shift组合键组合使用:表示该拖放操作完成移动功能。有些时候直接拖放默认就是复制。
  • 与Ctrl,shift组合键组合使用:表示为目标对象建立快捷方式(在Unix等平台上称为链接)。

12.5 Applet和JApplet

你可能感兴趣的:(疯狂java讲义-阅读小记,Swing编程)