Swing组件监听自身与内部类

时间:2011-05-02 10:31:53

标签: java swing listener inner-classes anonymous-class

我对uni项目得到了一些不好的反馈,需要一些公正的澄清;

任何人都可以解释我何时应该使用(匿名)内部监听器类与听取自己的组件? (a vs b)

A)

public class myButton extends JButton {

    public myButton() {

        addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                // handling code...

            }
        });
    }
}

b)中

public class myButton extends JButton implements ActionListener {

    public myButton() {

        addActionListener(this);
    }

    public void actionPerformed(ActionEvent e) {

        // handle the event
    }
}

谢谢你们, 米奇

4 个答案:

答案 0 :(得分:4)

c)

JButton myButton = new JButton(); 
myButton.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent e) { 
        // handling code...
    }
}); 

答案 1 :(得分:3)

如果你有多个具有不同行为的按钮,为每个按钮分配一个单独的匿名类会更方便,你仍然可以在你的类中实现ActionListener并根据来源处理事件:

void actionPerformed(ActionEvent e) { 
    if (e.getSrouce() == button1)
    { ... }
    else if (e.getSource() == button2)
    { ... }
    // ...
} 

答案 2 :(得分:1)

我认为这可能是个人偏好。无论如何,我总是将内部课程作为分离责任和组织代码的一种方式。

特别是,它们是使用Adapter类的唯一方法(已经实现某些特定Listener接口的空类,所以你只需要覆盖你需要的方法,你不需要提供那些那些的空实现。你不需要)。

答案 3 :(得分:1)

关键是,当您声明myButton类要实现ActionListener时,您会增加其可见API(即添加新的公共actionPerformed()方法,可以通过任何代码自由调用对myButton)的引用。

由于您可能不希望“actionPerformed”成为myButton API的一部分,因此您应该使用内部类,这将保留myButton的公共API。< / p>

请注意,Swing类充满了不好的例子,例如公共方法被明确注释为“实现细节,不直接调用”,实际上是非常糟糕的设计决策。