📜  SWING-事件监听器(1)

📅  最后修改于: 2023-12-03 15:05:26.696000             🧑  作者: Mango

SWING-事件监听器

在 SWING 界面编程中,事件监听器是编写交互式 GUI 应用程序中必要的一部分,这些程序包括了按钮、复选框、文本框、滚动条等组件。

SWING 的事件监听器遵循观察者模式,即当用户与应用程序进行交互时,组件会触发事件,事件监听器会捕捉该事件并执行相应的代码。

事件模型

考虑一个简单的按钮,当用户点击按钮时,按钮会处于被触发状态,该状态被称为发生了一个事件。为了处理这种情况,应用程序必须采取以下步骤:

  1. 已安装处理从用户接收的所有事件的代码。这称为事件监听器,它位于按钮对应的事件监听器接口下。
  2. 当用户触发事件时,由 JButton 组件向事件监听器对象传递事件对象。该事件包含了信息,如事件类型和发生事件的组件。
  3. 事件监听器对象捕获事件,执行预定义的操作,如单击按钮后打印一条消息或在文本框中显示计算结果。

SWING 中的事件监听器可以有多个。如果多个监听器注册同一事件,则所有监听器都将被调用。

事件监听器接口

在 SWING 中,事件监听器通过实现特定的接口来创建。以下是 SWING 中事件监听器接口的列表:

  1. ActionEvent:表示用户执行某个操作,如单击按钮或选择菜单项。
  2. AdjustmentEvent:表示允许用户滚动滚动条或拖动滑块。
  3. ComponentEvent:表示组件的视觉状态已更改。
  4. InputMethodEvent:表示输入法的文本输入发生了更改。
  5. ItemEvent:表示用户选择改变状态,例如复选框或单选按钮。
  6. KeyEvent:表示用户按下或释放键。
  7. MouseEvent:表示用户在组件上执行的操作,例如单击或拖动。
  8. MouseWheelEvent:表示用户滚动鼠标滚轮。
事件监听器创建

要创建一个事件监听器,首先需要创建实现期望监听的接口的类。例如,如果我们希望监听按钮单击事件,则需要实现 ActionListener 接口。以下是示例代码:

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
 
public class Example implements ActionListener {
 
    public static void main(String[] args) {
        new Example();
    }
 
    public Example() {
        JFrame frame = new JFrame("Event Listener Example");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 
        JButton button = new JButton("Click me!");
        button.addActionListener(this);
 
        frame.add(button);
        frame.pack();
        frame.setVisible(true);
    }
 
    @Override
    public void actionPerformed(ActionEvent e) {
        System.out.println("Button clicked!");
    }
}

在上面的示例中,我们首先创建了 Example 类,并实现了 ActionListener 接口。然后,我们创建一个 JFrame 对象来作为我们的主窗口。我们还创建了一个 JButton 对象,并将其添加到 JFrame 中。我们将创建的 Example 对象添加为按钮的 ActionListener。最后,我们调用 JFrame 的 pack() 和 setVisible() 方法,使窗口可见。

最后,我们实现 actionPerformed() 方法以打印消息来响应按钮单击事件。

事件处理模式

传统的事件驱动模式需要在一个事件处理器函数中添加所有的操作代码。当代码变得更复杂时,将来不断添加更多代码可能会显得很麻烦。为了避免这种情况,并提高代码的可维护性和可扩展性,可以使用模型-视图-控制器 (MVC) 设计模式。

在 MVC 中,事件监听器仅执行一个操作:向控制器 (controller) 传递事件对象。控制器接着将事件交给适当的模型 (model) 进行处理。模型将对事件做出反应,并可能导致视图 (view) 的更改。

以下是示例代码:

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
 
public class Example {
 
    private JFrame frame;
    private JButton button;
    private JLabel label;
    
    public static void main(String[] args) {
        new Example();
    }
 
    public Example() {
        frame = new JFrame("Event Listener Example");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 
        button = new JButton("Click me!");
        label = new JLabel("I am a label");
 
        button.addActionListener(new ButtonClickListener(this));
 
        frame.setLayout(new FlowLayout());
        frame.add(button);
        frame.add(label);
 
        frame.pack();
        frame.setVisible(true);
    }
 
    public void setLabelText() {
        label.setText("Button clicked!");
    }
}
 
class ButtonClickListener implements ActionListener {
 
    Example example;
 
    public ButtonClickListener(Example example) {
        this.example = example;
    }
 
    @Override
    public void actionPerformed(ActionEvent e) {
        example.setLabelText();
    }
}

在上面的示例中,我们创建了 Example 类作为主视图层 (view)。我们还创建了一个 JButton 和一个 JLabel,将这些组件添加到主 JFrame 中。我们还创建了一个 ButtonClickListener 类,以监听 JButton 的点击事件。当 JButton 被点击时,我们将 JLabel 的文本设置为 "Button clicked!"。

这种设计模式使代码更容易维护并允许更轻松地处理更多的事件类型。

总结

SWING 中的事件监听器是构建 GUI 应用程序的必要组成部分。它们允许应用程序响应用户交互,并包括多种事件监听器接口,以及一些常见的事件类型。

了解 SWING 中的事件监听器模型,可以提高代码的可维护性,并避免将所有代码放入一个处理器函数的方式,从而增加代码可扩展性。