我刚刚开始了解 Java 本身和 Java Swing,我在理解“Action Listener”概念时遇到了一些问题。人们说 C# 和 Java 非常相似,但当您实际尝试并比较它们时,那就是另一回事了。
我有一个按钮的以下自动生成的 Action 监听器:
btnNewButton.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
lblNylabel.setText("New label text");
}
});
我是这样理解的:
- 您通过对象“btnNewButton”调用非静态方法btnNewButton.addActionListener()
- 该方法将一个 ActionListener 实例作为参数
- 自动化代码通过“new ActionListener()”构造函数调用实例化一个 ActionListener 实例——我不明白的是我不能自己实例化 ActionListener 类,但它可以作为方法调用中的参数吗? ?
- “actionPerformed”方法在新的实例体内生成并在这里使用(什么?)
- 在“actionPerformed”方法中,您可以定义单击按钮时要执行的操作 - 非常合理
是否有可能以更易理解/更简单的方式来帮助我理解 ActionListener 概念?
最佳答案
What I don't understand is that I can't instansiate the ActionListener class myself, but it's possible as an argument in the method call??
当你做的时候
new ActionListener() {
public void actionPerformed(ActionEvent e) {
lblNylabel.setText("New label text");
}
}
您实际上是在创建一个 anonymous subclass 的实例ActionListener
的。
语义上等同于做
class AnonymousActionListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
lblNylabel.setText("New label text");
}
}
btnNewButton.addActionListener(new AnonymousActionListener());
(还有 tada,作为奖励,您刚刚了解到您可以在 Java 中拥有 method local classes ;-)
以下是一些常见的替代方案:
使用单独的普通类:
class MyActionListener implements ActionListener { public void actionPerformed(ActionEvent e) { lblNylabel.setText("New label text"); } } class YourClass { public void yourMethod() { ... btnNewButton.addActionListener(new MyActionListener()); } }
(只有在其他类可以访问所需变量的情况下才有可能。)
与上面相同,但有一个内部(非静态)类:
class YourClass { public void yourMethod() { ... btnNewButton.addActionListener(new MyActionListener()); } // Inner class class MyActionListener implements ActionListener { public void actionPerformed(ActionEvent e) { lblNylabel.setText("New label text"); } } }
(这里
lblNylabel
可能在内部类的范围内。)让 封闭类本身实现
ActionListener
并使用this
作为addActionListener
的参数:class YourClass implements ActionListener { public void yourMethod() { ... btnNewButton.addActionListener(this); } public void actionPerformed(ActionEvent e) { lblNylabel.setText("New label text"); } }
关于java - 了解 ActionListener,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10311014/