我在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
中的方法,同时不能重复调用构造函数。我怎样才能做到这一点?
答案 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
扩展MainClass
并MyBtnListener
在其构造函数中创建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}}
}