当Java Swing Action Listener类扩展另一个类时,避免无限循环

时间:2018-05-12 16:56:17

标签: java swing actionlistener

我在Swing中将ActionListener附加到JButton

主要班级:

 class MainClass {

    String foo;
    JButton button = new JButton("cool button");

    public MainClass(String foo) {
        this.foo = foo;
        ...
        JFrame setup here
        ...

        button.addActionListener(new MyBtnListener(frame));
        System.out.println(getFoo());
    }

    public String getFoo() {
        return this.foo;
    }

}

实现ActionListener方法的类:

class MyBtnListener extends MainClass implements ActionListener  {

    private JFrame target;

    public MyBtnListener(JFrame target) {
        this.target = target;
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        System.out.println("button clicked");
        //target.dispose();
    }

}

编译时,代码会产生如下结果: foofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoo(无限循环)。我需要ActionListener类才能访问MainClass中的方法,同时不能重复调用构造函数。我怎样才能做到这一点?

2 个答案:

答案 0 :(得分:1)

您的问题的答案非常简单:您搜索的内容称为“参考”。

只需将类型MainClass的私有字段添加到侦听器并在构造函数中初始化它:

private final JFrame frame;
private final MainClass reference;

public MyBtnListener(final JFrame frame, final MainClass reference)
{
     this.frame = frame;
     this.reference = reference;
}

然后您可以像这样调用getFoo方法:

final String foo = reference.getFoo();

MyBtnListener扩展MainClass类也非常重要。

答案 1 :(得分:0)

通过让MainClass扩展MainClassMyBtnListener在其构造函数中创建button.addActionListener(new MyBtnListener(frame));,您创建了一个循环,只要调用堆栈上有空间,该循环就会持续

MyBtnListener移至button.addActionListener(this);的构造函数为MyBtnListener,或者没有MainClass扩展ActionListener,只需实现class MainClass { String foo; JButton button = new JButton("cool button"); public MainClass(String foo) { this.foo = foo; ... JFrame setup here ... button.addActionListener(new MyBtnListener()); System.out.println(getFoo()); } public String getFoo() { return this.foo; } } class MyBtnListener implements ActionListener { @Override public void actionPerformed(ActionEvent e) { System.out.println("button clicked"); } }。

{{1}}

}