Swing 简明教程

SWING - Quick Guide

SWING - Overview

Swing API 是可扩展 GUI 组件集,可帮助开发者轻而易举地创建基于 Java 的前端/GUI 应用程序。它建立在 AWT API 之上,可替代 AWT API,因为它几乎每个控件都对应到 AWT 控件。Swing 组件遵循模型-视图-控制器架构以满足以下准则。

  1. 单个 API 就足以支持多种外观和感觉。

  2. API 应是模型驱动的,以便最高级别的 API 不需要有数据。

  3. API 应使用 Java Bean 模型,以便构建工具和 IDE 能够为开发者提供更好的使用服务。

MVC Architecture

Swing API 架构大致遵循 MVC 架构,具体方式如下。

  1. Model represents component’s data.

  2. 视图表示组件数据的视觉呈现。

  3. 控制器从视图中获取来自用户的输入,并在组件的数据中反映更改。

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

Swing Features

  1. Light Weight − Swing 组件独立于本机操作系统的 API,因为 Swing API 控件主要使用纯 JAVA 代码呈现,而不是使用底层操作系统调用。

  2. Rich Controls − Swing 提供丰富的先进控件集,如树、选项卡面板、滑块、吸管和表格控件。

  3. Highly Customizable − Swing 控件的视觉外观独立于内部表现,因此可以非常容易地对其进行定制。

  4. Pluggable look-and-feel − 可以根据运行时可用值随时更改基于 SWING 的 GUI 应用程序的外观和感觉。

SWING - Environment Setup

本部分将指导您如何在计算机上下载和设置 Java。请使用以下步骤设置环境。

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

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

Setting Up the Path for Windows 2000/XP

假设您已在 c:\Program Files\java\jdk 目录中安装了 Java−

Step 1 − 右键单击“我的电脑”并选择“属性”。

Step 2 − 单击“高级”选项卡下的“环境变量”按钮。

Step 3 − 更改“Path”变量,以便它还包含 Java 可执行文件的路径。例如,如果路径当前设置为 'C:\WINDOWS\SYSTEM32' ,请将路径更改为 'C:\WINDOWS\SYSTEM32;c:\Program Files\java\jdk\bin'

Setting Up the Path for Windows 95/98/ME

假设您已在 c:\Program Files\java\jdk 目录中安装了 Java−

Step 1 − 编辑 'C:\autoexec.bat' 文件并在末尾添加以下行: 'SET PATH=%PATH%;C:\Program Files\java\jdk\bin'

Setting Up the Path for Linux, UNIX, Solaris, FreeBSD

环境变量 PATH 应设置为指向 Java 二进制文件已安装的位置。如果您在执行此操作时遇到问题,请参阅 Shell 文档。

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

为了编写 Java 程序,您需要文本编辑器。市场上还有功能更强大的 IDE。但是目前,您可以考虑以下选项之一−

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

  2. Netbeans − Netbeans 是免费且开放源码的 Java IDE,可以从 https://www.netbeans.org/index.html 处下载。

  3. Eclipse − Eclipse 也是一个由 Eclipse 开源社区开发的 Java IDE,可以从 https://www.eclipse.org/ 处下载。

SWING - Controls

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

  1. UI Elements − 这些是用户最终看到并与之交互的核心可视元素。GWT 提供了广泛使用的常用元素的列表,从基本到复杂,我们将在本教程中介绍。

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

  3. Behavior − 这些是用户与 UI 元素交互时发生的事件。本部分将在事件处理章节中介绍。

swing class hierarchy

每个 SWING 控件都从以下组件类层次继承属性。

S.No.

Class & Description

1

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

2

Container 容器是一个可以包含其他 SWING 组件的组件

3

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

SWING UI Elements

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

S.No.

Class & Description

1

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

2

JButton 此类创建带标签的按钮。

3

JColorChooser JColorChooser 提供一个控件窗格,使用户能够操作和选择颜色。

4

JCheck Box JCheckbox 是一个图形组件,可以处于 on (真)或 off (假)状态。

5

JRadioButton JRadioButton 类是一个图形组件,可以处于一组中的 on (真)或 off (假)状态。

6

JList A JList 组件向用户显示可滚动的文本项目列表。

7

JComboBox A JComboBox 组件向用户显示选择弹出菜单。

8

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

9

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

10

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

11

ImageIcon A ImageIcon 控件是对 Icon 接口的实现,该接口从图像绘制图标

12

JScrollbar A Scrollbar 控件表示一个滚动条组件,以便用户能够从值的范围内进行选择。

13

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

14

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

15

JProgressBar 随着任务接近完成,进度条会显示任务的完成百分比。

16

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

17

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

SWING - Event Handling

在本章中,你将了解事件、其类型,以及如何处理事件。本文末尾提供了示例,以帮助你更好地理解。

What is an Event?

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

Types of Event

事件可以大致分为两类 −

  1. Foreground Events − 这些事件需要用户的直接交互。它们是由于用户与图形用户界面中的图形组件交互而产生的。例如,单击按钮、移动鼠标、通过键盘输入字符、从列表中选择项目、滚动页面等。

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

What is Event Handling?

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

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

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

  1. Source −源是发生事件的对象。源负责向处理程序提供已发生事件的信息。Java 为我们提供了源对象类。

  2. Listener −它也被称为事件处理程序。侦听器负责对事件生成响应。从 Java 实现的角度来看,侦听器也是一个对象。侦听器等待接收事件。一旦接收到事件,侦听器便处理事件,然后再返回。

此方法的优点是,用户界面逻辑与生成事件的逻辑完全分离。用户界面元素能够将事件处理委托给单独的一段代码。

在此模型中,侦听器需要向源对象注册,以便侦听器可以接收事件通知。这是一​​种处理事件的有效方法,因为只有希望接收事件的侦听器才会收到事件通知。

Steps Involved in Event Handling

Step 1 −用户单击按钮,生成事件。

Step 2 −自动创建有关事件类的对象,并将有关源和事件的信息填充到同一对象中。

Step 3 −事件对象转到已注册侦听器类的,方法。

Step 4 −该方法得到执行并返回。

Points to Remember About the Listener

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

  2. 如果您没有实现任何预定义的接口,那么您的类不能作为源对象的侦听器类。

Callback Methods

这些方法由 API 供应商提供并且由应用程序程序员定义,由应用程序开发人员调用。此处,回调方法表示事件方法。响应事件,java jre 将激发回调方法。所有此类回调方法都包含在侦听器接口中。

如果某个组件希望有侦听器来侦听其事件,则源必须向侦听器注册自身。

Event Handling Example

使用您选择的任意编辑器,使用以下命令创建 Java 程序,例如 D:/ > SWING > com > tutorialspoint > gui >

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 button

SWING - Event Classes

事件类表示事件。Java 提供各种事件类,但仅讨论最常用的事件类。

EventObject Class

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

Class Declaration

以下是对 java.util.EventObject 类的声明 −

public class EventObject
   extends Object
      implements Serializable

Field

以下是对 java.util.EventObject 类的字段 −

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

Class Constructors

Sr.No.

Constructor & Description

1

EventObject(Object source) 构建原型事件。

Class Methods

Sr.No.

Method & Description

1

Object getSource() 最初发生事件的对象。

2

String toString() 返回此 EventObject 的字符串表示形式。

Methods Inherited

此类从以下类继承方法 −

  1. java.lang.Object

SWING Event Classes

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

Sr.No.

Class & Description

1

AWTEvent 它是所有 SWING 事件的根事件类。该类及其子类取代了原始的 java.awt.Event 类。

2

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

3

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

4

KeyEvent 在输入字符时生成 Key 事件。

5

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

6

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

7

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

8

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

9

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

10

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

11

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

SWING - Event Listeners

事件侦听器表示负责处理事件的接口。Java 提供各种事件侦听器类,但我们只讨论使用最频繁的那些类。每个事件侦听器方法的一个方法只有一个参数,该参数是一个对象,它是 EventObject 类的子类。例如,鼠标事件侦听器方法接受 MouseEvent 的实例,其中 MouseEvent 派生自 EventObject。

EventListner Interface

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

Class Declaration

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

public interface EventListener

SWING Event Listener Interfaces

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

Sr.No.

Class & Description

1

ActionListener 该接口用于接收操作事件。

2

ComponentListener 该接口用于接收组件事件。

3

ItemListener 此界面用于接收项目事件。

4

KeyListener 此界面用于接收关键事件。

5

MouseListener 此界面用于接收鼠标事件。

6

WindowListener 此界面用于接收窗口事件。

7

AdjustmentListener 此界面用于接收调整事件。

8

ContainerListener 此界面用于接收容器事件。

9

MouseMotionListener 此界面用于接收鼠标移动事件。

10

FocusListener 此界面用于接收焦点事件。

SWING - Event Adapters

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

SWING Adapters

以下列出了 SWING 中用于侦听 GUI 事件的常见适配器列表。

Sr.No.

Adapter & Description

1

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

2

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

3

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

4

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

5

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

SWING - Layouts

布局是指容器内组件的排列。从另一个角度来说,也可以说布局是在容器内将组件放置在特定位置。放置控件的任务由布局管理器自动完成。

Layout Manager

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

  1. 在容器中处理大量控件非常繁琐。

  2. 通常,当我们需要排列组件时,并未提供组件的宽度和高度信息。

Java 提供了各种布局管理器来定位控件。诸如大小、形状和排列之类的属性在不同的布局管理器之间各不相同。当 applet 或应用程序窗口的大小改变时,组件的大小、形状和排列也会相应地改变,即布局管理器适应 applet 查看器或应用程序窗口的尺寸。

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

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

Sr.No.

Interface & Description

1

LayoutManager LayoutManager 接口声明了需要由其对象充当布局管理器的类的那些方法。

2

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

AWT Layout Manager Classes

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

Sr.No.

LayoutManager & Description

1

BorderLayout BorderLayout 排列组件以适合五个区域:东、西、北、南和中心。

2

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

3

FlowLayout FlowLayout 是默认布局。它以定向流形式布局组件。

4

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

5

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

6

GroupLayout GroupLayout 按层次结构对组件进行分组,以便将其放置在容器中。

7

SpringLayout SpringLayout 根据一组约束将与之关联的容器的子代定位。

SWING - Menu Classes

众所周知,每个顶级窗口都与它关联有一个菜单栏。此菜单栏由最终用户使用的各种菜单选项组成。此外,每个选项都包含一个称为下拉菜单的列表。菜单和 MenuItem 控件是 MenuComponent 类的子类。

Menu Hierarchy

swing menuhiearchy

Menu Controls

Sr.No.

Class & Description

1

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

2

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

3

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

4

JCheckboxMenuItem JCheckboxMenuItem 是 JMenuItem 的子类。

5

JRadioButtonMenuItem JRadioButtonMenuItem 是 JMenuItem 的子类。

6

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

SWING - Containers

容器是 SWING GUI 组件的组成部分。容器提供了放置组件的空间。AWT 中的 Container 本身就是一个组件,它提供了将组件添加到自身的特性。以下是需要考虑的部分注意事项。

  1. Container 的子类被称为 Container。例如,JPanel、JFrame 和 JWindow。

  2. 容器只能添加 Component 到自身。

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

SWING Containers

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

Sr.No.

Container & Description

1

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

2

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

3

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