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

我在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()方法本地定义了框架对象,我们在actionPerformed中使用了按钮,这是另一种方法。怎么可能?按钮是否嵌入到框架中?

谢谢..

有人可以解释如何在没有任何调用的情况下执行actionPerformed方法吗?

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

您的类实现ActionListener接口并调用addActionListener将其自身注册到按钮。 单击一个按钮时,Swing将尝试通过调用其actionPerformed方法通知所有已注册的ActionListener 。 这就是“神奇”发生的方式。

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

add将按钮add到框架的内容窗格中 – 这会将按钮放在框架中,而不是代码中 。 因为通过放置JButton button;JButton button;声明为实例变量JButton button; 在任何方法之外,它仍然可以从该类中的任何(非static )方法访问。

欢迎来到事件驱动的环境。

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

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

这通常称为观察者模式。

您可能会发现写作事件监听器是一个有用的读物

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

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

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

在Swing中,案例有点复杂。 Swing库保存对所有GUI元素(例如JFrame和JButton)的引用,这就是为什么它们不会被删除,即使您不再引用它们。

至于第一个问题,看一下主线程的作用 – 它创建一个新对象GuiDemo1,调用go()方法创建一个JFrame,并显示该帧。 有一个特殊的Swing线程,Event Dispatch Thread,它在后台等待GUI中的事件发生。 显示帧启动EDT,然后呈现帧并hibernate。 主线程,已完成主方法中的所有工作然后DIES。

现在您显示了JFrame并且事件调度线程正在hibernate。 EDT现在正在等待与JFrame的用户交互(事件) – Swing是事件驱动的。 每次与框架交互时,Swing都会为它创建一个事件并唤醒EDT来处理事件。 因此,例如,如果单击按钮,EDT会唤醒,动画按钮“单击”并调用所有动作侦听器。 那是你的方法actionPerformed被调用的时候。

  • 实现ActionListener

  • 将ActionListener添加到您的界面

  • 将actionPerformed方法添加到您的类中

  • 设置一个计时器并在你的课堂上启动它

那会做的