我可以在java中使用什么来添加addActionListener(this)而不是'this'?

时间:2015-09-18 21:18:12

标签: java swing

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

4 个答案:

答案 0 :(得分: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

的实例

答案 1 :(得分:1)

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

要回答您的问题,您可以替换"这个"由ActionListener的任何实例。你的XFrame碰巧是一个因此#34;这个"。但是你可以用其他地方创建的任何其他actionListener替换它。将通知actionListener。但重要的是,这个ActionListener必须在收到通知后做一些有趣的事情(可见!)。还有一个新的XFrame()"不能,因为它没有显示在屏幕上!只有当前显示在屏幕上的XFrame可以。

在复杂的系统中,您通常不希望您的Frame也是处理事件的帧,因为您想要分离概念。但是在学习Java时所做的简单程序中,通过单击按钮可以直观地查看显示的框架给出的反馈。

答案 2 :(得分:1)

  

在这种情况下'这个'做了什么......?

传递给this的{​​{1}}告诉按钮它应该在按钮的操作时调用b.addActionListener(this)对象的actionPerformed方法(即,即XFrame实例)被触发(即点击按钮)。

  

我可以用什么代替?

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

另一件好事:你不仅可以用其他otherActionListener对象'替换'this,你甚至可以在按钮上添加多个ActionListener个对象。例如。在下面的示例中,我添加了XFrame实例(ActionListener)和this。单击该按钮时,将执行两个对象的otherActionListener方法。

这是一个完整的例子:

actionPerformed

答案 3 :(得分:0)

查看 this (双关语)文章。另外,你可以采用另一种方式:

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