使用侦听器实现内部类的更好方法

时间:2013-04-12 00:04:09

标签: java swing actionlistener anonymous

我有一个内部类的主类。这是一个swing / GUI应用程序。

我有与摇摆相关的内部类,例如扩展JPanel,JDialog等......

在内部类中,我有匿名类,例如动作侦听器,我必须设置它并从外部类中获取数据。

例如,主类有内部类和内部类我有一个匿名的侦听器类,如下所示:

public class Main extends JApplet {
 //etc...
  private class CTable extends JPanel {
      CDialog td;
      private JPopupMenu menu;
      public CTable(String title, AbstractTableModel tableModel) {
         //etc...
         menu = new JPopupMenu();
         JMenuItem menuItem = new JMenuItem("Test");
         menu.add(menuItem);
         //etc...
         menuItem.addActionListener(new ActionListener() {
           public void actionPerformed(ActionEvent event) {
              CTable.this.td = new CDialog("Test");
              CTable.this.td.setVisible(true);
           }
         });
     }

}

我唯一的问题只是关于它是否可以像这样访问变量: CTable.this.td = new CDialog(“Test”); CTable.this.td.setVisible(真); ...来自匿名课程和关于不同实施策略/设计模式的建议。

2 个答案:

答案 0 :(得分:1)

我知道匿名的内部类是永远的Swing成语,但我从来都不喜欢它们。

就个人而言,我认为听众是控制者的一部分。我更喜欢Swing组件是纯视图,让控制器实例化它们并为它们提供他们需要作为控制器选择的监听器。不要让视图必须担心它与控制器的通信方式或它在哪里。

答案 1 :(得分:0)

CTable.this.td.setVisible(true);

有一条名为Law of demeter的规则。这表明您应该只直接访问类。通过跨越多个对象来获得所需的方法,您将在类之间创建tight coupling,这使得将来更改单个类变得更加困难。

我建议的设计模式可能是Proxy class。代理类充当两个类之间的缓冲区,意味着两个类通过Proxy class

相互通信