2011-05-02 74 views
1

我刚刚对uni项目得到了一些不好的反馈,需要一些公正的澄清;Swing组件听自己vs内部类

任何人都可以解释什么时候应该使用(匿名)内部监听器类与听自己的组件? (A对B)

一)

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 
    } 
} 

谢谢你们, 米奇

+3

为什么扩展'JButton'? – 2011-05-02 10:36:07

+2

请学习Java命名约定,并坚持他们 – kleopatra 2011-05-02 10:42:33

+1

好老师,假设他/她拒绝了这两项:-) – kleopatra 2011-05-02 10:47:42

回答

3

对于您有不同的行为多个按钮的情况下,更方便为每个按钮分配一个单独的匿名类,您仍然可以在您的类中实现ActionListener并根据源处理事件:

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

与问题无关,但我似乎在追求:-)这是程序风格,所以不要。 – kleopatra 2011-05-02 10:46:21

+0

我同意。正如我写的,它是更方便地使用匿名/分班授课,这种情况下,我只是指出了一个类实现ActionListener的所有按钮的含义。并感谢您的评论。 – MByD 2011-05-02 12:38:03

+0

我觉得OP试图问一个问题到这就是答案,但我强烈同意[@ AndrewThompson的答案](http://stackoverflow.com/a/5856145/253468)。 – TWiStErRob 2014-10-16 20:12:40

1

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

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

4

C)

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

的一点是,当你宣布你myButton类来实现ActionListener,可以增加其可见的API(即增加一个新的公共actionPerformed()方法,通过持有一个参考的任何代码可自由赎回到myButton)。

既然你可能不希望“actionPerformed”是myButton API的一部分,你应该使用一个内部类,将保留的myButton公共API。

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