ActionListener如何工作?

时间:2013-04-30 20:43:28

标签: java swing actionlistener

我在Oracle的网站上发现了类似的代码。出于空间原因,我删除了一些关于布局的无关紧要的东西。

private JTextField textField;

public class TextDemo extends JPanel implements ActionListener
{
    public TextDemo()
    {
        textField = new JTextField(5);
        //This causes a leaking this in constructor warning...
        textField.addActionListener(this);

        //code here for layout and to add the textfield to the panel
    }


    private static int ctr = 0;

    @Override
    public void actionPerformed(ActionEvent evt)
    {
        System.out.println(ctr++);           
    }

}

所以我创建了一个print语句来打印并增加一个计数器来检查这个actionListener何时检测到一个动作。

我在想:

  1. 触发此方法的唯一操作是输入按钮吗?
  2. 在我将this附加到textField对象的动作侦听器的构造函数中,究竟发生了什么?

4 个答案:

答案 0 :(得分:1)

首先:通常使用DocumentListener作为JTextField。它讲述了有关正在发生的事情的更多有趣信息。它实际上与GUI领域背后的文档(一种模型)相关联。

现在:

Q1 - 很难确定哪些鼠标和键盘操作会导致Swing屏幕组件上的各种事件。我记得,可能是ActionPerformed。但是可以将自定义代码添加到JTextField的子类中,从而导致动作事件触发您想要的任何内容。如果你这样做,你必须要小心。

Q2:Listener对象存储在所有想要知道文本字段何时发生该动作事件的对象的列表中。发生这种情况时,文本字段会在其侦听器列表中的所有对象上调用actionPerformed()方法。

您可能想对观察者模式进行一些研究。这是一个经常用于执行此类操作的代码的名称。它可以在很多情况下使用。关键是它使听众和听众(观察者和被观察者)松散地结合在一起。对象侦听只需告诉它正在侦听的对象在某些情况下要通知它。正在被监听的对象保存所有各种对象的监听列表以及他们想要通知的事件。这就是所有的连接,并且使用简单的接口,它可以简单地编程。

答案 1 :(得分:1)

  

触发此方法的唯一操作是输入按钮吗?

是。对于JTextFields,按ENTER键将调度ActionEvent

  

在我的构造函数中,我将它附加到textField对象的动作侦听器,究竟发生了什么?

您在组件中注册ActionListener。触发ActionEvent时,会调度ActionEvent调用actionPerformed,并在ActionEvent中传递源对象的详细信息。

实现ActionListeners的首选方法是为每个组件使用单独的匿名侦听器,或者为共享功能使用单个具体Action

答案 2 :(得分:1)

  1. AFAIK,是的。当文本字段具有焦点时按下输入时调用侦听器。
  2. 正在构造的当前对象被添加到文本字段的ActionListener列表中,以便在文本字段中按下enter时,将调用当前对象的actionPerformed()方法。将未完全构造的对象传递给另一个对象通常是一种不好的做法,因为另一个对象可以直接调用它并且该对象不能正常工作,因为尚未完全构造。

答案 3 :(得分:1)

每当用户执行操作时,都会发生操作事件。

示例:当用户单击按钮时,选择一个菜单项,在文本字段中按Enter键。结果是actionPerformed消息被发送到在相关组件上注册的所有动作侦听器。

这是对当前对象的引用 - 正在调用其方法或构造函数的对象。您可以使用此

从实例方法或构造函数中引用当前对象的任何成员
 textField.addActionListener(this); // registering actionlistener

捕获动作事件

@Override
public void actionPerformed(ActionEvent evt)
{
    System.out.println(ctr++);   //perform some action on click        
}  

http://docs.oracle.com/javase/tutorial/uiswing/events/actionlistener.html

根据Hovercraft Full Of Eels的建议,您也可以使用匿名内部类,如下所示

 textField.addActionListener(new ActionListener() {
             @Override
              public void actionPerformed(ActionEvent arg0) {
              //do something
              }  
         });