- Swing 教程
- Swing - 首页
- Swing - 概述
- Swing - 环境
- Swing - 控件
- Swing - 事件处理
- Swing - 事件类
- Swing - 事件监听器
- Swing - 事件适配器
- Swing - 布局
- Swing - 菜单
- Swing - 容器
- Swing 有用资源
- Swing - 快速指南
- Swing - 有用资源
- Swing - 讨论
Swing - 事件处理
在本章中,您将学习关于事件、事件类型,以及如何处理事件。本章末尾提供了示例以帮助您更好地理解。
什么是事件?
对象状态的变化称为事件,即事件描述了源对象状态的变化。事件是由用户与图形用户界面组件交互产生的。例如,点击按钮、移动鼠标、通过键盘输入字符、从列表中选择项目以及滚动页面等活动都会导致事件的发生。
事件类型
事件可以大致分为两类:
前台事件 - 这些事件需要用户的直接交互。它们是由用户与图形用户界面中的图形组件交互产生的结果。例如,点击按钮、移动鼠标、通过键盘输入字符、从列表中选择项目、滚动页面等。
后台事件 - 这些事件需要最终用户的交互。操作系统中断、硬件或软件故障、计时器到期和操作完成是一些后台事件的示例。
什么是事件处理?
事件处理是一种控制事件并决定事件发生时应采取何种操作的机制。此机制包含一段代码,称为事件处理程序,当事件发生时执行该代码。
Java 使用委托事件模型来处理事件。此模型定义了生成和处理事件的标准机制。
委托事件模型具有以下关键参与者。
源 - 源是在其上发生事件的对象。源负责将其处理程序的信息提供给已发生的事件。Java 为源对象提供了类。
监听器 - 也称为事件处理程序。监听器负责对事件做出响应。从 Java 实现的角度来看,监听器也是一个对象。监听器等待直到收到事件。一旦收到事件,监听器就会处理事件并返回。
这种方法的好处是用户界面逻辑与生成事件的逻辑完全分离。用户界面元素能够将事件的处理委托给单独的代码段。
在此模型中,需要将监听器注册到源对象,以便监听器可以接收事件通知。这是一种有效的事件处理方式,因为事件通知仅发送给想要接收它们的监听器。
事件处理涉及的步骤
步骤 1 - 用户单击按钮并生成事件。
步骤 2 - 自动创建相关事件类的对象,并在同一对象中填充有关源和事件的信息。
步骤 3 - 事件对象转发到已注册的监听器类的 method 中。
步骤 4 - method 被执行并返回。
关于监听器的要点
为了设计一个监听器类,您必须开发一些监听器接口。这些 Listener 接口预测了一些公共抽象回调 method,这些 method 必须由监听器类实现。
如果您没有实现任何预定义的接口,那么您的类不能充当源对象的监听器类。
回调方法
这些是 API 提供者提供的 method,由应用程序程序员定义并由应用程序开发人员调用。这里的回调 method 表示事件 method。响应事件,Java JRE 将触发回调 method。所有这些回调 method 都在监听器接口中提供。
如果某个组件希望某个监听器监听其事件,则源必须将其自身注册到监听器。
事件处理示例
使用您选择的任何编辑器在例如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
验证以下输出。