java中的事件处理和actionPerformed方法在java中的执行
我已经用java为simpleGUI编写了一个小代码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; /**
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
方法来通知它们。“魔法”就是这样发生的