Swing事件处理

广告位

在本章中,您将了解事件及其类型,并了解如何处理事件。为了更好地理解,在小节的末尾提供了一个演示示例。 事件是什…

在本章中,您将了解事件及其类型,并了解如何处理事件。为了更好地理解,在小节的末尾提供了一个演示示例。

事件是什么?

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

事件类型

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

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

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

什么是事件处理?

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

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

授权事件模型具有以下主要参与者。

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

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

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

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

事件处理的步骤

第1步 – 用户单击按钮并生成事件。
第2步 – 自动创建相关事件类的对象,并在同一对象中填充有关源和事件的信息。
第3步 – 将事件对象转发到已注册的监听器类方法。
第4步 – 监听器类方法执行并返回。

关于监听器的要点

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

如果未实现任何预定义接口,则类不能充当源对象的侦听器类。

回调方法

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

如果组件想要某个侦听器监听其事件,则源必须注册到侦听器。

事件处理示例

使用编辑器创建以下Java程序:

 import java.awt.*; import java.awt.event.*; import javax.swing.*;  public class EventHandlingExample {     private JFrame mainFrame;     private JLabel headerLabel;     private JLabel statusLabel;     private JPanel controlPanel;      public EventHandlingExample() {         prepareGUI();     }      public static void main(String[] args) {         EventHandlingExample swingControlDemo = new EventHandlingExample();         swingControlDemo.showEventDemo();     }      private void prepareGUI() {         mainFrame = new JFrame("Java SWING监听处理示例");         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("确定");         JButton submitButton = new JButton("提交");         JButton cancelButton = new JButton("取消");          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("点击了'确定'按钮");             } else if (command.equals("Submit")) {                 statusLabel.setText("点击了'提交'按钮");             } else {                 statusLabel.setText("点击了'取消'按钮");             }         }     } } 

执行上面示例代码,得到以下结果:

Swing事件处理

  

拾荒的老头

关于作者: 拾荒的老头

为您推荐