SWING - 快速指南


SWING - 概述

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

  • 单个 API 足以支持多种外观。

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

  • API就是利用Java Bean模型,让Builder Tools和IDE能够更好的服务给开发者使用。

MVC架构

Swing API 架构以下列方式遵循松散的基于 MVC 架构。

  • 模型代表组件的数据。

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

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

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

秋千特点

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

  • 丰富的控件- Swing 提供了一组丰富的高级控件,例如 Tree、TabbedPane、滑块、颜色选择器和表格控件。

  • 高度可定制- 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(图形用户界面)提供最终的外观和感觉。这部分将在布局章节中介绍。

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

用户界面类

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

编号 类别和描述
1 成分

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

2 容器

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

3 J组件

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

SWING 用户界面元素

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

编号 类别和描述
1 J标签

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

2 J按钮

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

3 J颜色选择器

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

4 J复选框

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

5 J单选按钮

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

6 列表

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

7 J组合框

JComboBox 组件向用户提供一个显示选项菜单。

8 文本字段

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

9 J密码字段

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

10 文本区

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

11 图像图标

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

12 JScrollbar

滚动条控件表示滚动条组件,以便用户能够从值范围中进行选择。

13 J选项面板

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

14 文件选择器

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

15 J进度条

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

16 JS滑块

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

17 号 JSpinner

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

SWING - 事件处理

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

什么是事件?

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

活动类型

这些事件可大致分为两类 -

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

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

什么是事件处理?

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

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

委托活动模型有以下主要参与者。

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

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

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

在该模型中,侦听器需要向源对象注册,以便侦听器可以接收事件通知。这是处理事件的有效方法,因为事件通知仅发送给那些想要接收它们的侦听器。

事件处理涉及的步骤

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

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

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

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

关于倾听者需要记住的要点

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

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

回调方法

这些是由 API 提供者提供、由应用程序程序员定义并由应用程序开发人员调用的方法。这里的回调方法代表一个事件方法。为了响应事件,java jre 将触发回调方法。所有此类回调方法都在侦听器接口中提供。

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

事件处理示例

使用您选择的任何编辑器创建以下 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 事件处理

SWING - 活动类别

事件类代表事件。Java 提供了各种 Event 类,但是,仅讨论那些更常用的事件类。

事件对象类

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

类别声明

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

public class EventObject
   extends Object
      implements Serializable

场地

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

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

类构造函数

先生。 构造函数及描述
1

事件对象(对象源)

构造一个原型事件。

类方法

先生。 方法及说明
1

对象 getSource()

最初发生事件的对象。

2

字符串转字符串()

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

继承的方法

该类继承了以下类的方法 -

  • java.lang.Object

SWING 活动课程

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

先生。 类别和描述
1 AWT事件

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

2 动作事件

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

3 输入事件

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

4 关键事件

输入字符时会生成按键事件。

5 鼠标事件

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

6 窗口事件

该类的对象表示窗口状态的变化。

7 调整事件

该类的对象表示由Adjustable对象发出的调整事件。

8 组件事件

该类的对象表示窗口状态的变化。

9 容器事件

该类的对象表示窗口状态的变化。

10 鼠标移动事件

该类的对象表示窗口状态的变化。

11 绘制事件

该类的对象表示窗口状态的变化。

SWING - 事件监听器

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

事件监听器接口

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

类别声明

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

public interface EventListener

SWING 事件监听器接口

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

先生。 类别和描述
1 动作监听器

该接口用于接收动作事件。

2 组件监听器

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

3 项目监听器

该接口用于接收item事件。

4 按键监听器

该接口用于接收按键事件。

5 鼠标监听器

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

6 窗口监听器

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

7 调整监听器

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

8 容器监听器

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

9 鼠标移动监听器

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

10 焦点监听器

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

SWING - 事件适配器

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

SWING 适配器

以下是在 SWING 中侦听 GUI 事件时常用的适配器的列表。

先生。 适配器及说明
1 焦点适配器

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

2 钥匙适配器

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

3 鼠标适配器

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

4 鼠标移动适配器

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

5 窗口适配器

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

SWING - 布局

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

布局管理器

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

  • 在容器内处理大量的控件是非常繁琐的。

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

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

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

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

先生。 接口及说明
1 布局管理器

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

2 布局管理器2

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

AWT 布局管理器类

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

先生。 布局管理器和描述
1 边框布局

边框布局将组件排列为适合五个区域:东、西、北、南和中心。

2 卡片布局

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

3 流式布局

FlowLayout 是默认布局。它将组件按定向流进行布局。

4 网格布局

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

5 网格包布局

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

6 组布局

GroupLayout 对组件进行分层分组,以便将它们放置在容器中。

7 Spring布局

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

SWING - 菜单类

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

菜单层次结构

Swing 菜单层次结构

菜单控制

先生。 类别和描述
1 J菜单栏

JMenuBar 对象与顶级窗口关联。

2 J菜单项

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

3 J菜单

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

4 JCheckbox菜单项

JCheckboxMenuItem 是 JMenuItem 的子类。

5 JRadioButton菜单项

JRadioButtonMenuItem 是 JMenuItem 的子类。

6 J弹出菜单

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

SWING - 容器

容器是 SWING GUI 组件的一个组成部分。容器提供了可以放置组件的空间。AWT 中的容器本身就是一个组件,并且它提供向自身添加组件的功能。以下是需要考虑的一些值得注意的要点。

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

  • 容器只能向其自身添加一个组件。

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

摇摆容器

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

先生。 容器及描述
1 控制板

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

2 框架

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

3 窗户

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