2

我在 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++);           
    }

}

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

我想知道:

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

4 回答 4

1

每当用户执行一个动作时,就会发生一个动作事件。

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

这是对当前对象的引用——正在调用其方法或构造函数的对象。您可以使用 this 从实例方法或构造函数中引用当前对象的任何成员

 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
              }  
         });
于 2013-04-30T20:57:10.777 回答
1

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

是的。For JTextFieldsanActionEvent是通过按 ENTER 发送的。

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

ActionListener向组件注册。当 anActionEvent被触发时,它会分派一个ActionEventwhereactionPerformed被调用,将源对象的详细信息传递给它ActionEvent

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

于 2013-04-30T20:52:26.060 回答
1
  1. AFAIK,是的。当文本字段具有焦点时按下 enter 时调用侦听器。
  2. 正在构造的当前对象被添加到文本字段的 ActionListener 列表中,因此当在文本字段中按下 enter 时,将actionPerformed()调用当前对象的方法。将未完全构造的对象传递给另一个对象通常是一种不好的做法,因为另一个对象可以直接将其回调,并且该对象将无法正常工作,因为尚未完全构造。
于 2013-04-30T20:54:14.513 回答
1

第一:通常使用 DocumentListener 作为 JTextField。它告诉更多关于正在发生的事情的有趣信息。它实际上与位于 GUI 字段后面的文档(一种模型)相关联。

现在:

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

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

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

于 2013-04-30T20:49:12.263 回答