1

也许我正在以错误的方式解决这个问题。让我知道使用 Swing 和 AWT,我在一个框架上设置了几个按钮,它们每个都有一个 ActionListener 对应于它们的特定功能 IE

JButton foo_button = new JButton("Foo-Me");
foo_button.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent evt) {
        //Fancy schmancy code work
    } 
})
JButton bar_button = new JButton("Bar None");
bar_button.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent evt) {
        //Fancy schmancy code work
    } 
})

所以这些按钮中的每一个都做自己的事情。但是,如果我希望所有按钮都做某件事(每个按钮都使用相同的方法),在我的情况下,在他们做自己的事情之前清除标签怎么办。

显然,我可以将whatever_label.setText("") 添加到每个actionPerformed() 中,但这需要很多重复,我不太喜欢。

哦,Java 和 Swing 大师来帮助我。

4

3 回答 3

7

您可以将自己的实现子类化ActionListener

private static abstract class MyListener implements ActionListener {

    @Override
    final public void actionPerformed(ActionEvent evt) {
        theSameTask();
        uniqueTask(evt);
    } 
    private void theSameTask() {
        // the identical task
    }
    public abstract void uniqueTask(ActionEvent evt);
}

然后,新的侦听器将如下所示:

JButton bar_button = new JButton("Bar None");
bar_button.addActionListener(new MyListener() {
    @Override public void uniqueTask(ActionEvent evt) {
        //Fancy schmancy code work
    } 
});
于 2012-07-17T11:27:44.637 回答
3

另一种可能性是使用“装饰器”模式ActionListener,并为常见行为编写装饰器。您的代码将采用以下形式

bar_button.addActionListener(new MyActionListenerDecorator( new ActionListener() {
    public void actionPerformed(ActionEvent evt) {
        //Fancy schmancy code work
    }  }) );
于 2012-07-17T12:08:07.680 回答
3

我认为最好的方法是使用Action. 这样所有的听众总是做同样的事情。

于 2012-07-17T12:17:39.050 回答