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