java中的事件处理和actionPerformed方法在java中的执行

java中的事件处理和actionPerformed方法在java中的执行,java,swing,user-interface,event-handling,Java,Swing,User Interface,Event Handling,我已经用java为simpleGUI编写了一个小代码 package guidemo1; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; public class GuiDemo1 implements ActionListener{ JButton button; /**

我已经用java为simpleGUI编写了一个小代码

package guidemo1;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;

public class GuiDemo1 implements ActionListener{
 JButton button;
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        GuiDemo1 gui=new GuiDemo1();
        gui.go();
    }

    public void go()
    {
        JFrame frame=new JFrame();
        button=new JButton();
        frame.getContentPane().add(button);
        button.addActionListener(this);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(300, 200);
        frame.setVisible(true);

    }
    @Override
    public void actionPerformed(ActionEvent e) {
        //throw new UnsupportedOperationException("Not supported yet.");
        button.setText("I've been clicked");
    }
}
我是JAVA的新手。我有一些关于这个程序的问题

有人能解释一下actionPerformed方法在没有任何调用的情况下是如何执行的吗

在这里,我已经在go()方法的本地定义了frame对象,我们在actionPerformed中使用了button,这是另一种方法。这怎么可能呢?按钮不是嵌入到了frame中吗


谢谢..

您的类实现了
ActionListener
,因此您必须定义
actionPerformed
方法。您还可以调用
button.addActionListener(this)
,它将当前对象注册为按钮按下的侦听器


触发按钮按下事件时,将通知所有侦听器,包括已注册为侦听器的对象。

您的类实现了
ActionListener
,因此您必须定义
actionPerformed
方法。您还可以调用
button.addActionListener(this)
,它将当前对象注册为按钮按下的侦听器


触发按钮按下事件时,将通知所有侦听器,包括已注册为侦听器的对象。

欢迎使用事件驱动环境

在这种环境中,您注册“侦听器”,这些侦听器将等待某些事情发生,然后通过定义良好的接口结构向您报告

基本上,一个正在发生的事情是,您将自己注册为按钮上可能发生的动作事件的感兴趣方。您通过实现
ActionListener
接口实现了这一点。这允许按钮在执行某个操作时在将来某个时间回调您的
actionPerformed
方法

这通常被称为观察者模式


您可能会发现一个有用的读物

欢迎使用事件驱动环境

在这种环境中,您注册“侦听器”,这些侦听器将等待某些事情发生,然后通过定义良好的接口结构向您报告

基本上,一个正在发生的事情是,您将自己注册为按钮上可能发生的动作事件的感兴趣方。您通过实现
ActionListener
接口实现了这一点。这允许按钮在执行某个操作时在将来某个时间回调您的
actionPerformed
方法

这通常被称为观察者模式


关于第二个问题,您可能会找到一本有用的读物,Java是一种参考语言。所有对象都驻留在堆上,只要有人持有对它们的引用,它们就处于活动状态

在Swing中,情况稍微复杂一点。Swing库保存对所有GUI元素(如JFrame和JButton)的引用,因此即使您不再保存对它们的引用,它们也不会被删除

至于第一个问题,看看主线程做什么——它创建一个新的对象GuiDemo1,调用go()方法创建一个JFrame,并显示该帧。有一个特殊的Swing线程,即事件分派线程,它在后台等待GUI中的事件发生。显示帧将启动EDT,然后EDT渲染帧并休眠。主线程完成了主方法中的所有工作,然后死亡


现在显示了一个JFrame,事件调度线程处于休眠状态。EDT现在正在等待用户与JFrame的交互(事件)——Swing是事件驱动的。每次与帧交互时,Swing都会为其创建一个事件,并唤醒EDT以处理该事件。例如,如果您单击一个按钮,EDT将唤醒并设置按钮“单击”的动画,并调用所有动作侦听器。这就是调用方法actionPerformed的时候。

至于第二个问题,Java是一种参考语言。所有对象都驻留在堆上,只要有人持有对它们的引用,它们就处于活动状态

在Swing中,情况稍微复杂一点。Swing库保存对所有GUI元素(如JFrame和JButton)的引用,因此即使您不再保存对它们的引用,它们也不会被删除

至于第一个问题,看看主线程做什么——它创建一个新的对象GuiDemo1,调用go()方法创建一个JFrame,并显示该帧。有一个特殊的Swing线程,即事件分派线程,它在后台等待GUI中的事件发生。显示帧将启动EDT,然后EDT渲染帧并休眠。主线程完成了主方法中的所有工作,然后死亡

现在显示了一个JFrame,事件调度线程处于休眠状态。EDT现在正在等待用户与JFrame的交互(事件)——Swing是事件驱动的。每次与帧交互时,Swing都会为其创建一个事件,并唤醒EDT以处理该事件。例如,如果您单击一个按钮,EDT将唤醒并设置按钮“单击”的动画,并调用所有动作侦听器。这就是调用方法actionPerformed的时候

有人能解释一下actionPerformed方法在没有任何调用的情况下是如何执行的吗

GUI框架Swing在后台运行操作处理代码。每当按下按钮或用户以其他方式与GUI交互时,Swing都会通过许多
Listener
界面之一通知您的应用程序。为了接收这些事件,您的类需要实现适当的
Listener
接口,并在它感兴趣的每个组件上注册为侦听器

您的类实现了
ActionListener
接口,并调用
addActionListener
将自己注册到按钮。单击按钮时,Swing将尝试通过调用所有注册的
ActionListener
s的
actionPerformed
方法来通知它们。“魔法”就是这样发生的