我刚刚开始了解Java本身和Java Swing,我在理解“Action Listener”概念时遇到了一些问题。人们说C#和Java非常相似,但是当你真正试用它们并进行比较时,这是另一个故事。
我为按钮提供了以下自动生成的动作侦听器:
btnNewButton.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
lblNylabel.setText("New label text");
}
});
我理解如下:
是否可以通过更加理解/简单的方式来帮助我理解ActionListener概念呢?
答案 0 :(得分:12)
我不明白的是我不能自己实现ActionListener类,但它可以作为方法调用中的参数??
当你这样做时
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");
}
}