gpt4 book ai didi

java - 如何在没有显式调用的情况下调用 'actionPerformed' 方法?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:52:42 27 4
gpt4 key购买 nike

我刚开始使用 Swing 学习 GUI,并不完全了解 actionPerformed 方法的工作原理。考虑以下代码:

//code to create a button and change its text when clicked
public class simplegui implements ActionListener {
JButton button;

public static void main(String[] args) {
simplegui gui=new simplegui();
gui.go();
}

public void go() {
JFrame frame=new Frame();
button=new JButton("click Me");
button.addActionListener(this);

frame.getContentPane().add(button);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(300,300);
frame.setVisible(true);
}

public void actionPerformed(ActionEvent event) {
button.setText("I've been clicked!");
}
}

难道不应该在调用类的方法之前为类创建对象(静态方法除外)吗?

当按钮被点击时,actionPerformed 方法被调用,但是如何呢?在哪里打电话?我已经实现了接口(interface)ActionListener,但是知道当 Action 发生时应该将“ActionEvent”对象发送到“actionPerformed”方法的代码在哪里?它存在于 Button 类中吗? Button 类中是否存在 addActionListener 方法?

当我点击按钮时,系统调用 Action 是如何执行的,执行gui.actionPerformed()的代码在哪里?

直到现在,我一直遵循 Java 的 OO、静态等概念,但整个事件驱动编程令人困惑。

最佳答案

每个事件都由一个对象表示,该对象提供有关事件的信息并标识事件源。事件源通常是组件或模型,但其他类型的对象也可以是事件源。

在这里,你注册的监听器,也就是说,

button.addActionListener(this);

被添加到监听器列表中,当 JVM 接收到事件(在本例中为单击)时,它会调用列表中所有监听器的适当方法。

这是怎么发生的?好吧,我认为你应该阅读 java 中的Callback 机制。

您还可以使用回调机制创建您的自己的监听器。考虑以下代码:

该代码用于模拟信用卡应用程序。在下面的代码中,pinChanged() 方法changePin() 方法被调用。

public interface PinChangeListener {
public void pinChanged();
}

public class CreditCard {
public PinChangeListener pinChangeListener;

private int pin;

public changePin(int pin) {
this.pin = pin;
if (pinChangeListener != null) {
pinChangeListener.pinChanged();
}
}
}

要将回调/监听器连接到信用卡,您只需实现 PinChangeListener 方法:

creditCard.pinChangeListener = new PinChangeListener() {
public void pinChanged() {
System.out.println("The pin has been changed");
}
};

类似地,当您将监听器附加到按钮时,JVM 会检测到点击(您可能不想深入了解如何检测点击!)和 actionPerformed() JVM 会为您调用附加的监听器。希望一切顺利。

关于java - 如何在没有显式调用的情况下调用 'actionPerformed' 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25592125/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com