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

Java 使用侦听器实现内部类的更好方法,java,swing,actionlistener,anonymous,Java,Swing,Actionlistener,Anonymous,我有一个带有内部类的主类。这是一个swing/GUI应用程序 我有一些与swing相关的内部类,比如扩展JPanel、JDialog等等 在内部类中,我有匿名类,比如action listeners,我必须设置这些类并从外部类获取数据 例如,main类有一个内部类,而在内部类中我有一个匿名侦听器类,如下所示: public class Main extends JApplet { //etc... private class CTable extends JPanel { CD

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

我有一些与swing相关的内部类,比如扩展JPanel、JDialog等等

在内部类中,我有匿名类,比如action listeners,我必须设置这些类并从外部类获取数据

例如,main类有一个内部类,而在内部类中我有一个匿名侦听器类,如下所示:

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(true)
…来自匿名类和关于不同实现策略/设计模式的建议。

我知道匿名内部类永远都是Swing的习惯用法,但我从来都不喜欢它们

就我个人而言,我认为听众是控制器的一部分。我更喜欢Swing组件是纯视图的,让控制器实例化它们,并为它们提供所需的侦听器,以作为控制器选择的对象。不要让视图担心它与控制器的通信方式或它所在的位置

CTable.this.td.setVisible(true);
有一条规则叫做。这说明您应该只直接访问类。通过单步遍历多个对象以获得所需的方法,可以在类之间创建对象,这使得将来更改单个类变得更加困难


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

相互通信,我个人不想这样做。我主要关心的是,如果有人扩展了您的类并希望更改对话框的工作方式,会发生什么情况?从技术上讲,这是一个问题。来自主类的getter将允许开发人员有机会更改此行为,而无需尝试并找出如何更改您的内部类…是的,我不得不为这个问题复制大量代码-关于模块化的MHOgood点。谢谢,我会接受您的MVC回答,但其他建议也很好。太糟糕了,stackoverflow不允许“接受”多个答案