GUI中监听器的嵌套类的优点

lee*_*roy 11 java user-interface swing encapsulation listener

对于规模适中的项目,我被告知当你有扩展JPanels的类时,最好的做法是使用嵌套类来实现监听器.例如,我可以有一个扩展JPanel的类FactoryScreen,并有一个嵌套类FactoryScreenBrain,它实现了所有必要的监听器.

我从来没有能够以这种方式对我的类封装特定的好处或缺点有一个很好的解释,直到现在总是只有扩展JPanel和实现监听器的类.有人能为我提供一些指导吗?

don*_*ton 8

为听众设置内部课程使得所有听众的目的非常明确.如果以更多编码为代价进行检查,它有时也可以避免许多.

如果你有一个小组

public class MyPanel extends JPanel implements ActionListener
...
    button1.addActionListener(this);
    button2.addActionListener(this);
    checkbox1.addActionListener(this);
    timer3.addActionListener(this);

    public void actionPerformed(ActionEvent e)
    {
        if(e.getSource() == button1)
        else...
        ... //potentially many elses
    }
Run Code Online (Sandbox Code Playgroud)

很难确切地看到你的actionPerformed中发生了什么,因为它一次处理了很多不同的事件.有一个小组:

public class MyPanel extends JPanel
...
    button1.addActionListener(new ButtonListener());
    button2.addActionListener(new ButtonListener());
    checkbox1.addActionListener(new CheckBoxListener());
    timer3.addActionListener(new TimerListener());

    private class TimerListener implements ActionListener
    {
        public void actionPerformed(ActionEvent e)
        {
            //do stuff related only to timers
        }
    }
Run Code Online (Sandbox Code Playgroud)

现在,如果您的计时器有问题,您可以轻松识别出有问题的班级.

更重要的是,在大规模上,它使您的代码更具可读性.如果其他人想要在这个类上工作并且他们需要使用计时器修复事件处理,他们不必搜索你的ifs以找到具有计时器逻辑的部分.


Hov*_*els 6

我认为任何东西都比让一个类扩展一个Swing组件并实现一个监听器更好,因为它给了类太多不同的职责,并为创建可怕的交换板监听器设置了一个.我尝试使用匿名内部侦听器从单独的控件类调用方法.这样我就分出了责任,可以更容易地孤立地测试每个类的行为.

顺便问一下好问题.

  • 对.这是关注点的分离,这是一个巨大的胜利.嵌套(或匿名)内部类只有一个作业要做.使跟踪整个行为变得非常容易.例如,如果你有一个面板,其中有几十个对象调用一个actionPerformed方法,那么它会使该方法更大,更难理解或维护.例如,如果您出于某种目的更改该方法,则会冒着意外影响该方法处理的其他职责的风险. (3认同)