Swing 容器
创建图形用户界面程序的第一步是创建一个容器类以容纳其他组件,常见的窗口就是一种容器。容器本身也是一种组件,它的作用就是用来组织、管理和显示其他组件。
Swing 中容器可以分为两类:顶层容器和中间容器。
顶层容器是进行图形编程的基础,一切图形化的东西都必须包括在顶层容器中。顶层容器是任何图形界面程序都要涉及的主窗口,是显示并承载组件的容器组件。在 Swing 中有三种可以使用的顶层容器,分别是 JFrame、JDialog 和 JApplet。
- JFrame:用于框架窗口的类,此窗口带有边框、标题、关闭和最小化窗口的图标。带 GUI 的应用程序至少使用一个框架窗口。
- JDialog:用于对话框的类。
- JApplet:用于使用 Swing 组件的 Java Applet 类。
中间容器是容器组件的一种,也可以承载其他组件,但中间容器不能独立显示,必须依附于其他的顶层容器。常见的中间容器有 JPanel、JScrollPane、JTabbedPane 和 JToolBar。
• JPanel:表示一个普通面板,是最灵活、最常用的中间容器。
• JScrollPane:与 JPanel 类似,但它可在大的组件或可扩展组件周围提供滚动条。
• JTabbedPane:表示选项卡面板,可以包含多个组件,但一次只显示一个组件,用户可在组件之间方便地切换。
• JToolBar:表示工具栏,按行或列排列一组组件(通常是按钮)。
在 Java 程序中容器类都是继承自 Container 类。中间容器和顶层容器在,AWT 包和 Swing 包中继承 Container 类的继承关系,如图 2 所示。
图2 容器类组织结构图
JPanel 面板
JPanel 是一种中间层容器,它能容纳组件并将组件组合在一起,但它本身必须添加到其他容器中使用。JPanel 类的构造方法如下。
• JPanel():使用默认的布局管理器创建新面板,默认的布局管理器为 FlowLayout。
• JPanel(LayoutManagerLayout layout):创建指定布局管理器的 JPanel 对象。
事件处理模型
前面我们讲解了如何放置各种组件,使图形界面更加丰富多彩,但是还不能响应用户的任何操作。若使图形界面能够接收用户的操作,必须给各个组件加上事件处理机制。在事件处理的过程中,主要涉及三类对象。
• Event(事件):用户对组件的一次操作称为一个事件,以类的形式出现。例如,键盘操作对应的事件类是 KeyEvent。
• Event Source(事件源):事件发生的场所,通常就是各个组件,例如按钮 Button。
• Event Handler(事件处理者):接收事件对象并对其进行处理的对象事件处理器,通常就是某个 Java 类中负责处理事件的成员方法。
由于同一个事件源上可能发生多种事件,因此,Java 采取了授权模型(Delegation Model),事件源可以把在其自身上所有可能发生的事件分别授权给不同的事件处理者来处理。例如,在 Panel 对象上既可能发生鼠标事件,也可能发生键盘事件,该 Panel 对象可以授权给事件处理者 a 来处理鼠标事件,同时授权给事件处理者 b 来处理键盘事件。
有时也将事件处理者称为监听器,主要原因在于监听器时刻监听事件源上所有发生的事件类型,一旦该事件类型与自己所负责处理的事件类型一致,就马上进行处理。授权模型把事件的处理委托给外部的处理实体进行处理,实现了将事件源和监听器分开的机制。
事件处理者(监听器)通常是一个类,该类如果能够处理某种类型的事件,就必须实现与该事件类型相对的接口。例如,一个 ButtonHandler 类之所以能够处理 ActionEvent 事件,原因在于它实现了与 ActionEvent 事件对应的接口 ActionListener。每个事件类都有一个与之相对应的接口。
动作事件监听器
动作事件监听器是 Swing 中比较常用的事件监听器,很多组件的动作都会使用它监听,像按钮被里击、列表框中选择一项等。与动作事件监听器有关的信息如下。
• 事件名称:ActionEvent。
• 事件监听接口: ActionListener。
• 事件相关方法:addActionListener() 添加监听,removeActionListener() 删除监听。
• 涉及事件源:JButton、JList、JTextField 等。
焦点事件监听器
除了单击事件外,焦点事件监听器在实际项目中应用也比较广泛,例如将光标离开文本框时弹出对话框,或者将焦点返回给文本框等。
与焦点事件监听器有关的信息如下。
• 事件名称:FocusEvent。
• 事件监听接口: FocusListener。
• 事件相关方法:addFocusListener() 添加监听,removeFocusListener() 删除监听。
• 涉及事件源:Component 以及派生类。
FocusEvent 接口定义了两个方法,分别为 focusGained() 方法和 focusLost() 方法,其中 focusGained() 方法是在组件获得焦点时执行,focusLost() 方法是在组件失去焦点时执行。