【问题标题】:What can I use in java for addActionListener(this) instead of 'this'?我可以在 java 中为 addActionListener(this) 而不是“this”使用什么?
【发布时间】:2015-09-18 21:18:11
【问题描述】:

说,我有一个扩展 JFrame 并实现 ActionListener 的类 XFrame。在课堂上我有一个 JButton b 并且我覆盖了 actionPerformed 方法。现在在构造函数中我必须设置 b.addActionListener(this)。我的问题是:在这种情况下,'this' 做了什么,我可以用什么代替它?我试过 b.addActionListener(new XFrame()) 但没用。

【问题讨论】:

  • 你可以创建一个 actionListener 的实例来代替这个。例如: new ActionListener() { public void actionPerformed( ActionEvent ae ) { } );
  • 这意味着 this 在任何其他情况下的含义 - 对当前对象的引用
  • 您可以传递任何实例,就像任何其他函数调用一样。你有什么问题?
  • JButton.addActionListener() 的参数是一个ActionListener 实例,当按钮上出现ActionEvent 时应通知该实例。它可以是anyActionListener,并且您可以通过这种方式在同一个按钮上注册多个。
  • 在此上下文中,这是一个 ActionListener 的实例。真正的问题是,您希望实现什么目标?

标签: java swing


【解决方案1】:

尝试匿名类:

public class Test {

    public static void main(final String[] args) {
        final JFrame frame = new JFrame();
        final JButton button = new JButton("Test");
        button.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(final ActionEvent e) {
                System.out.println("pressed");
            }
        });

        frame.getContentPane().add(button);
        frame.pack();
        frame.setVisible(true);
    }
}

或者,如果您想让您的 JFrame 实现 ActionListener 而不是使用匿名类,请参阅this example。在这种情况下,this 将引用 JFrame 的实例。

【讨论】:

    【解决方案2】:

    “它没有用”是什么意思。我希望它编译得很好,但它没有达到你的预期。这是正常的,因为您说的是 actionListener 不是来自接收事件的 XFrame 的那个,而是与另一个 XFrame 相关的 actionlistener(新的 XFrame() 作为参数)。这另一个 XFrame 甚至可能不会显示在屏幕上!所以不要期望看到任何东西;)

    要回答您的问题,您可以将“this”替换为 ActionListener 的任何实例。您的 XFrame 恰好是其中之一,因此是“this”。但是你可以用其他任何地方创建的任何其他 actionListener 来替换它。 actionListener 将被通知。但重要的一点是,这个 ActionListener 必须在收到通知时做一些有趣的事情(可见!)。并且“new XFrame()”不能因为它没有显示在屏幕上!只有当前显示在屏幕上的 XFrame 可以。

    在一个复杂的系统中,您通常不希望您的 Frame 也是处理事件的一个,因为您想分离概念。但是在学习 Java 时所做的简单程序中,通常更容易直观地看到单击按钮时显示的 Frame 给出的反馈。

    【讨论】:

      【解决方案3】:

      'this' 在这种情况下会做什么......?

      传递给b.addActionListener(this)this 告诉按钮,每当触发按钮的操作(即单击按钮)时,它应该调用this 对象(即XFrame 实例)的actionPerformed 方法)。

      我可以用什么代替它?

      您可以将其替换为实现ActionListener 接口的任何其他对象。这通常是通过“匿名”类完成的,如下例中的otherActionListener

      另一件好事:您不仅可以用其他ActionListener 对象“替换”this,甚至可以将多个ActionListener 对象添加到按钮。例如。在下面的示例中,我添加了 XFrame 实例 (this) 和 otherActionListener。当点击按钮时,两个对象的actionPerformed 方法都会被执行。

      这里有一个完整的例子:

      import static javax.swing.JOptionPane.showMessageDialog;
      
      import java.awt.event.ActionEvent;
      import java.awt.event.ActionListener;
      
      import javax.swing.JButton;
      import javax.swing.JFrame;
      
      public class XFrame extends JFrame implements ActionListener {
          JButton b = new JButton("Click me");
      
          ActionListener otherActionListener = new ActionListener() {
      
              @Override
              public void actionPerformed(ActionEvent e) {
                  showMessageDialog(XFrame.this, "The other action says: 'Hi'");
              }
          };
      
          public XFrame() {
              getContentPane().add(b);
      
              b.addActionListener(this);
      
              b.addActionListener(otherActionListener);
          }
      
          @Override
          public void actionPerformed(ActionEvent e) {
             showMessageDialog(this, "XFrame says: 'hello'");
          }
      
          public static void main(String[] args) {
              XFrame frame = new XFrame();
              frame.setSize(100,60);
              frame.setVisible(true);
          }
      }
      

      【讨论】:

        【解决方案4】:

        查看this(双关语)文章。另外,您可以这样做的另一种方法是:

        ActionListener e = new ActionListener(){
                @Override
                public void actionPerformed(ActionEvent arg0) {
                    // TODO Auto-generated method stub
                }
        };
        b.add(e);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-04-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-08-15
          • 2010-10-13
          相关资源
          最近更新 更多