1

我在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 中使用按钮,这是另一种方法。这怎么可能?按钮不是嵌入框架上吗?

谢谢..

4

5 回答 5

3

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

当一个按钮按下事件被触发时,所有的监听器都会被通知,包括你注册为监听器的对象。

于 2013-02-21T10:43:26.923 回答
3

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

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

基本上,正在发生的事情是,您将自己注册为按钮上可能发生的操作事件的相关方。您已经通过实现ActionListener接口来完成此操作。这允许按钮在将来某个时间执行操作时回调您的actionPerformed方法。

这通常称为观察者模式。

您可能会发现编写事件侦听器很有用

于 2013-02-21T10:46:27.823 回答
1

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

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

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

现在您已经显示了一个 JFrame 并且 Event Dispatch Thread 正在休眠。EDT 现在正在等待用户与 JFrame 的交互(事件)——Swing 是事件驱动的。每次与框架交互时,Swing 都会为其创建一个事件并唤醒 EDT 以处理该事件。例如,如果您单击一个按钮,EDT 将唤醒,为按钮“单击”设置动画并调用所有动作侦听器。那是您的方法 actionPerformed 被调用的时候。

于 2013-02-21T10:50:32.243 回答
1

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

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

您的类实现ActionListener接口并调用addActionListener以将自身注册到按钮。当一个按钮被点击时,Swing 将尝试ActionListener通过调用他们的actionPerformed方法来通知所有注册的s。“魔法”就是这样发生的。

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

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

于 2013-02-21T10:56:08.633 回答
0
  • 实现 ActionListener

  • 将 ActionListener 添加到您的界面

  • 将 actionPerformed 方法添加到您的类

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

那会做到的

于 2013-03-30T19:28:12.803 回答