Swing 快速指南



Swing - 概述

Swing API 是一套可扩展的 GUI 组件,旨在简化开发人员创建基于 JAVA 的前端/GUI 应用程序的工作。它构建在 AWT API 之上,并作为 AWT API 的替代品,因为它几乎拥有与 AWT 控件相对应的所有控件。Swing 组件遵循模型-视图-控制器架构以满足以下条件。

  • 单个 API 必须足以支持多种外观和感觉。

  • API 必须是模型驱动的,因此最高级别的 API 不需要拥有数据。

  • API 必须使用 Java Bean 模型,以便构建工具和 IDE 可以为开发人员提供更好的服务。

MVC 架构

Swing API 架构遵循如下所示的松散的 MVC 架构。

  • 模型表示组件的数据。

  • 视图表示组件数据的可视化表示。

  • 控制器接收用户在视图上的输入,并反映组件数据的变化。

  • Swing 组件将模型作为单独的元素,而视图和控制器部分则组合在用户界面元素中。因此,Swing 具有可插拔的外观和感觉架构。

Swing 特性

  • **轻量级** - Swing 组件独立于本地操作系统的 API,因为 Swing API 控件主要使用纯 JAVA 代码而不是底层操作系统调用来呈现。

  • **丰富的控件** - Swing 提供了一套丰富的先进控件,例如树、选项卡窗格、滑块、颜色选择器和表格控件。

  • **高度可定制** - Swing 控件可以很容易地定制,因为视觉外观独立于内部表示。

  • **可插拔的外观和感觉** - 基于 SWING 的 GUI 应用程序的外观和感觉可以在运行时根据可用值进行更改。

Swing - 环境设置

本节指导您如何在计算机上下载和设置 Java。请按照以下步骤设置环境。

Java SE 可从以下链接免费获取 下载 Java。因此,您可以根据您的操作系统下载相应的版本。

按照说明下载 Java 并运行 **.exe** 文件以在您的计算机上安装 Java。在计算机上安装 Java 后,您需要设置环境变量以指向正确的安装目录。

为 Windows 2000/XP 设置路径

假设您已将 Java 安装在 **c:\Program Files\java\jdk** 目录中 -

**步骤 1** - 右键单击“我的电脑”,然后选择“属性”。

**步骤 2** - 在“高级”选项卡下单击“环境变量”按钮。

**步骤 3** - 修改“Path”变量,使其也包含 Java 可执行文件的路径。例如,如果路径当前设置为 **'C:\WINDOWS\SYSTEM32'**,则将路径更改为 **'C:\WINDOWS\SYSTEM32;c:\Program Files\java\jdk\bin'**。

为 Windows 95/98/ME 设置路径

假设您已将 Java 安装在 **c:\Program Files\java\jdk** 目录中 -

**步骤 1** - 编辑 **'C:\autoexec.bat'** 文件,并在末尾添加以下行:**'SET PATH=%PATH%;C:\Program Files\java\jdk\bin'**。

为 Linux、UNIX、Solaris、FreeBSD 设置路径

应将环境变量 PATH 设置为指向 Java 二进制文件安装的位置。如果您遇到问题,请参考您的 Shell 文档。

例如,如果您使用 **bash** 作为您的 shell,则您需要在 **'.bashrc: export PATH=/path/to/java:$PATH'** 末尾添加以下行。

常用的 Java 编辑器

要编写 Java 程序,您需要一个文本编辑器。市场上甚至还有更复杂的 IDE 可用。但就目前而言,您可以考虑以下其中一种 -

  • **记事本** - 在 Windows 机器上,您可以使用任何简单的文本编辑器,如记事本(本教程推荐)、TextPad。

  • **Netbeans** - Netbeans 是一个开源且免费的 Java IDE,可以从 https://www.netbeans.org/index.html 下载。

  • **Eclipse** - Eclipse 也是由 Eclipse 开源社区开发的 Java IDE,可以从 https://www.eclipse.org/ 下载。

Swing - 控件

每个用户界面都考虑以下三个主要方面 -

  • **UI 元素** - 这些是用户最终看到并与之交互的核心可视元素。GWT 提供了大量广泛使用和常见的元素,从基本到复杂,我们将在本教程中介绍。

  • **布局** - 它们定义了 UI 元素如何在屏幕上组织,并为 GUI(图形用户界面)提供最终的外观和感觉。这部分将在布局章节中介绍。

  • **行为** - 这些是用户与 UI 元素交互时发生的事件。这部分将在事件处理章节中介绍。

UI classes

每个 Swing 控件都继承自以下组件类层次结构的属性。

序号 类和描述
1 Component

Component 是 Swing 非菜单用户界面控件的抽象基类。Component 代表具有图形表示的对象

2 Container

Container 是可以包含其他 Swing 组件的组件

3 JComponent

JComponent 是所有 Swing UI 组件的基类。为了使用继承自 JComponent 的 Swing 组件,该组件必须位于其根为顶级 Swing 容器的包含层次结构中

Swing UI 元素

以下是使用 Swing 设计 GUI 时常用的控件列表。

序号 类和描述
1 JLabel

JLabel 对象是用于在容器中放置文本的组件。

2 JButton

此类创建一个带标签的按钮。

3 JColorChooser

JColorChooser 提供一组控件窗格,旨在允许用户操作和选择颜色。

4 JCheckBox

JCheckBox 是一个图形组件,可以处于 **开启** (true) 或 **关闭** (false) 状态。

5 JRadioButton

JRadioButton 类是一个图形组件,可以处于 **开启** (true) 或 **关闭** (false) 状态,在一个组中。

6 JList

JList 组件向用户呈现一个可滚动的文本项列表。

7 JComboBox

JComboBox 组件向用户呈现一个显示选项菜单的选择。

8 JTextField

JTextField 对象是一个文本组件,允许编辑单行文本。

9 JPasswordField

JPasswordField 对象是一个专门用于密码输入的文本组件。

10 JTextArea

JTextArea 对象是一个文本组件,允许编辑多行文本。

11 ImageIcon

ImageIcon 控件是 Icon 接口的实现,用于从图像绘制图标

12 JScrollbar

Scrollbar 控件代表一个滚动条组件,以便用户可以从一系列值中进行选择。

13 JOptionPane

JOptionPane 提供一组标准对话框,用于提示用户输入值或告知用户某些信息。

14 JFileChooser

JFileChooser 控件表示一个对话框窗口,用户可以在其中选择文件。

15 JProgressBar

随着任务进展到完成,进度条会显示任务的完成百分比。

16 JSlider

JSlider 允许用户通过在有界区间内滑动旋钮来以图形方式选择值。

17 JSpinner

JSpinner 是一个单行输入字段,允许用户从有序序列中选择数字或对象值。

Swing - 事件处理

在本章中,您将学习事件及其类型,还将学习如何处理事件。本章末尾提供了示例,以便更好地理解。

什么是事件?

对象状态的变化称为 **事件**,即事件描述了源状态的变化。事件是由于用户与图形用户界面组件交互而生成的。例如,单击按钮、移动鼠标、通过键盘输入字符、从列表中选择项目和滚动页面是导致事件发生的活动。

事件类型

事件大致可分为两类 -

  • **前台事件** - 这些事件需要用户的直接交互。它们是由于一个人与图形用户界面中的图形组件交互而产生的结果。例如,单击按钮、移动鼠标、通过键盘输入字符、从列表中选择项目、滚动页面等。

  • **后台事件** - 这些事件需要最终用户的交互。操作系统中断、硬件或软件故障、计时器到期和操作完成是一些后台事件的示例。

什么是事件处理?

事件处理是控制事件并决定事件发生时应发生什么的机制。此机制具有称为事件处理程序的代码,该代码在事件发生时执行。

Java 使用委托事件模型来处理事件。此模型定义了生成和处理事件的标准机制。

委托事件模型具有以下关键参与者。

  • **源** - 源是发生事件的对象。源负责向其处理程序提供已发生事件的信息。Java 为源对象提供了类。

  • **监听器** - 也称为事件处理程序。监听器负责生成对事件的响应。从 Java 实现的角度来看,监听器也是一个对象。监听器等待直到收到事件。一旦收到事件,监听器就会处理事件然后返回。

这种方法的好处是用户界面逻辑与生成事件的逻辑完全分离。用户界面元素能够将事件的处理委托给单独的代码。

在此模型中,需要将监听器注册到源对象,以便监听器可以接收事件通知。这是一种高效的事件处理方式,因为事件通知仅发送给希望接收它们的那些监听器。

事件处理涉及的步骤

**步骤 1** - 用户单击按钮并生成事件。

**步骤 2** - 自动创建相关事件类的对象,并且有关源和事件的信息将填充到同一个对象中。

**步骤 3** - 事件对象被转发到已注册监听器类的的方法。

**步骤 4** - 方法被执行并返回。

关于监听器的要点

  • 为了设计监听器类,您必须开发一些监听器接口。这些监听器接口预测一些公共抽象回调方法,这些方法必须由监听器类实现。

  • 如果您没有实现任何预定义的接口,那么您的类就不能充当源对象的监听器类。

回调方法

这些是由 API 提供者提供的、由应用程序程序员定义并由应用程序开发人员调用的方法。这里的回调方法表示事件方法。响应事件,Java JRE 将触发回调方法。所有这些回调方法都在监听器接口中提供。

如果组件希望某些监听器监听其事件,则源必须将自身注册到监听器。

事件处理示例

使用您选择的任何编辑器,在D:/ > SWING > com > tutorialspoint > gui >目录下创建以下Java程序。

SwingControlDemo.java

package com.tutorialspoint.gui;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class SwingControlDemo {
   private JFrame mainFrame;
   private JLabel headerLabel;
   private JLabel statusLabel;
   private JPanel controlPanel;

   public SwingControlDemo(){
      prepareGUI();
   }
   public static void main(String[] args){
      SwingControlDemo swingControlDemo = new SwingControlDemo();  
      swingControlDemo.showEventDemo();       
   }
   private void prepareGUI(){
      mainFrame = new JFrame("Java SWING Examples");
      mainFrame.setSize(400,400);
      mainFrame.setLayout(new GridLayout(3, 1));

      headerLabel = new JLabel("",JLabel.CENTER );
      statusLabel = new JLabel("",JLabel.CENTER);        
      statusLabel.setSize(350,100);
      
      mainFrame.addWindowListener(new WindowAdapter() {
         public void windowClosing(WindowEvent windowEvent){
            System.exit(0);
         }        
      });    
      controlPanel = new JPanel();
      controlPanel.setLayout(new FlowLayout());

      mainFrame.add(headerLabel);
      mainFrame.add(controlPanel);
      mainFrame.add(statusLabel);
      mainFrame.setVisible(true);  
   }
   private void showEventDemo(){
      headerLabel.setText("Control in action: Button"); 

      JButton okButton = new JButton("OK");
      JButton submitButton = new JButton("Submit");
      JButton cancelButton = new JButton("Cancel");

      okButton.setActionCommand("OK");
      submitButton.setActionCommand("Submit");
      cancelButton.setActionCommand("Cancel");

      okButton.addActionListener(new ButtonClickListener()); 
      submitButton.addActionListener(new ButtonClickListener()); 
      cancelButton.addActionListener(new ButtonClickListener()); 

      controlPanel.add(okButton);
      controlPanel.add(submitButton);
      controlPanel.add(cancelButton);       

      mainFrame.setVisible(true);  
   }
   private class ButtonClickListener implements ActionListener{
      public void actionPerformed(ActionEvent e) {
         String command = e.getActionCommand();  
         
         if( command.equals( "OK" ))  {
            statusLabel.setText("Ok Button clicked.");
         } else if( command.equals( "Submit" ) )  {
            statusLabel.setText("Submit Button clicked."); 
         } else {
            statusLabel.setText("Cancel Button clicked.");
         }  	
      }		
   }
}

使用命令提示符编译程序。进入D:/ > SWING目录,然后输入以下命令。

D:\AWT>javac com\tutorialspoint\gui\SwingControlDemo.java

如果未出现错误,则表示编译成功。使用以下命令运行程序。

D:\AWT>java com.tutorialspoint.gui.SwingControlDemo

验证以下输出。

SWING  Event Handling

Swing - 事件类

事件类表示事件。Java提供了各种事件类,但这里只讨论最常用的几种。

EventObject 类

它是所有事件状态对象都应从中派生的根类。所有事件都使用对对象的引用(即)来构造,该对象在逻辑上被认为是事件最初发生的对象。此类在java.util包中定义。

类声明

以下是java.util.EventObject类的声明:

public class EventObject
   extends Object
      implements Serializable

字段

以下是java.util.EventObject类的字段:

protected Object source − 事件最初发生的对象。

类构造函数

序号 构造函数和说明
1

EventObject(Object source)

构造一个原型事件。

类方法

序号 方法和说明
1

Object getSource()

事件最初发生的对象。

2

String toString()

返回此EventObject的字符串表示形式。

继承的方法

此类继承自以下类的方法:

  • java.lang.Object

Swing 事件类

以下是常用事件类的列表。

序号 类和描述
1 AWTEvent

它是所有Swing事件的根事件类。此类及其子类取代了原来的java.awt.Event类。

2 ActionEvent

单击按钮或双击列表项时会生成ActionEvent。

3 InputEvent

InputEvent类是所有组件级输入事件的根事件类。

4 KeyEvent

输入字符时会生成KeyEvent。

5 MouseEvent

此事件表示组件中发生了鼠标操作。

6 WindowEvent

此类的对象表示窗口状态的更改。

7 AdjustmentEvent

此类的对象表示可调整对象发出的调整事件。

8 ComponentEvent

此类的对象表示窗口状态的更改。

9 ContainerEvent

此类的对象表示窗口状态的更改。

10 MouseMotionEvent

此类的对象表示窗口状态的更改。

11 PaintEvent

此类的对象表示窗口状态的更改。

Swing - 事件监听器

事件监听器表示负责处理事件的接口。Java提供了各种事件监听器类,但这里只讨论最常用的几种。事件监听器方法的每个方法都有一个参数,该参数是一个EventObject类的子类的对象。例如,鼠标事件监听器方法将接受MouseEvent的实例,其中MouseEvent派生自EventObject。

EventListener 接口

这是一个标记接口,每个监听器接口都必须扩展它。此类在java.util包中定义。

类声明

以下是java.util.EventListener接口的声明:

public interface EventListener

Swing 事件监听器接口

以下是常用事件监听器的列表。

序号 类和描述
1 ActionListener

此接口用于接收操作事件。

2 ComponentListener

此接口用于接收组件事件。

3 ItemListener

此接口用于接收项目事件。

4 KeyListener

此接口用于接收键盘事件。

5 MouseListener

此接口用于接收鼠标事件。

6 WindowListener

此接口用于接收窗口事件。

7 AdjustmentListener

此接口用于接收调整事件。

8 ContainerListener

此接口用于接收容器事件。

9 MouseMotionListener

此接口用于接收鼠标移动事件。

10 FocusListener

此接口用于接收焦点事件。

Swing - 事件适配器

适配器是用于接收各种事件的抽象类。这些类中的方法是空的。这些类作为创建监听器对象的便捷方式而存在。

Swing 适配器

以下是监听Swing中GUI事件时常用的适配器列表。

序号 适配器和说明
1 FocusAdapter

一个用于接收焦点事件的抽象适配器类。

2 KeyAdapter

一个用于接收键盘事件的抽象适配器类。

3 MouseAdapter

一个用于接收鼠标事件的抽象适配器类。

4 MouseMotionAdapter

一个用于接收鼠标移动事件的抽象适配器类。

5 WindowAdapter

一个用于接收窗口事件的抽象适配器类。

Swing - 布局

布局是指容器内组件的排列方式。换句话说,布局就是在容器中将组件放置在特定位置。布局管理器自动完成布局控件的任务。

布局管理器

布局管理器自动将所有组件放置在容器内。即使不使用布局管理器,组件仍然由默认布局管理器进行定位。可以手动布局控件,但是由于以下两个原因,这会变得非常困难。

  • 处理容器中的大量控件非常繁琐。

  • 通常,在需要排列组件时,不会给出组件的宽度和高度信息。

Java提供了各种布局管理器来定位控件。大小、形状和排列等属性因布局管理器而异。当小程序或应用程序窗口的大小发生变化时,组件的大小、形状和排列也会相应地发生变化,即布局管理器会适应小程序查看器或应用程序窗口的尺寸。

布局管理器与每个容器对象相关联。每个布局管理器都是实现LayoutManager接口的类的对象。

以下是定义布局管理器功能的接口。

序号 接口和说明
1 LayoutManager

LayoutManager接口声明了其对象将充当布局管理器的类需要实现的方法。

2 LayoutManager2

LayoutManager2是LayoutManager的子接口。此接口适用于那些知道如何根据布局约束对象布局容器的类。

AWT 布局管理器类

以下是使用AWT设计GUI时常用的控件列表。

序号 布局管理器和说明
1 BorderLayout

BorderLayout将组件排列在五个区域中:东、西、北、南和中心。

2 CardLayout

CardLayout对象将容器中的每个组件视为一张卡片。一次只能看到一张卡片。

3 FlowLayout

FlowLayout是默认布局。它按方向流布局组件。

4 GridLayout

GridLayout以矩形网格的形式管理组件。

5 GridBagLayout

这是最灵活的布局管理器类。GridBagLayout的对象垂直、水平或沿基线对齐组件,而无需组件大小相同。

6 GroupLayout

GroupLayout以分层方式对组件进行分组,以便将它们定位在容器中。

7 SpringLayout

SpringLayout根据一组约束来定位其关联容器的子项。

Swing - 菜单类

我们知道每个顶级窗口都关联着一个菜单栏。此菜单栏包含最终用户可用的各种菜单选项。此外,每个选项都包含一个选项列表,称为下拉菜单。菜单和MenuItem控件是MenuComponent类的子类。

菜单层次结构

Swing Menu Hiearchy

菜单控件

序号 类和描述
1 JMenuBar

JMenuBar对象与顶级窗口相关联。

2 JMenuItem

菜单中的项目必须属于JMenuItem或其任何子类。

3 JMenu

JMenu对象是从菜单栏显示的下拉菜单组件。

4 JCheckboxMenuItem

JCheckboxMenuItem是JMenuItem的子类。

5 JRadioButtonMenuItem

JRadioButtonMenuItem是JMenuItem的子类。

6 JPopupMenu

JPopupMenu可以在组件内的指定位置动态弹出。

Swing - 容器

容器是Swing GUI组件的组成部分。容器提供一个组件可以放置的空间。AWT中的容器本身就是一个组件,它提供了将组件添加到自身的功能。以下是一些需要注意的事项。

  • 容器的子类称为容器。例如,JPanel、JFrame和JWindow。

  • 容器只能将组件添加到自身。

  • 每个容器中都存在一个默认布局,可以使用setLayout方法覆盖它。

Swing 容器

以下是使用Swing设计GUI时常用的容器列表。

序号 容器和说明
1 面板

JPanel是最简单的容器。它提供了一个空间,可以在其中放置任何其他组件,包括其他面板。

2 框架

JFrame是一个带有标题和边框的顶级窗口。

3 窗口

JWindow对象是一个没有边框和菜单栏的顶级窗口。

广告