Java 嵌套回调的模式

Java 嵌套回调的模式,java,swing,callback,Java,Swing,Callback,在这个Swing示例中,我为JFrame和JMenuBar Frame.class以及MenuBar.class和Main.class提供了两个独立的类,我在其中完成了工作。我正在使用回调通知Main.class用户的选择 就MenuBar.class而言,这会导致嵌套回调,因为我是从Frame.class创建MenuBar.class的 我的代码正在运行,但我想知道是否有这样的模式 import java.awt.event.ActionEvent; import java.awt.event

在这个Swing示例中,我为JFrame和JMenuBar Frame.class以及MenuBar.class和Main.class提供了两个独立的类,我在其中完成了工作。我正在使用回调通知Main.class用户的选择

就MenuBar.class而言,这会导致嵌套回调,因为我是从Frame.class创建MenuBar.class的

我的代码正在运行,但我想知道是否有这样的模式

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;

public class Main {

  public static void main(String[] args) {
    java.awt.EventQueue.invokeLater(new Runnable() {
      @Override
      public void run() {
        Frame frame = new Frame() {
          @Override
          public void execute(Object obj) {
            System.out.println(obj);
          }
        };
      }
    });
  }
}

interface Callback {
  void execute(Object obj);
}

abstract class Frame extends JFrame implements Callback {
  Frame() {
    setTitle("GUI");
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setBounds(100, 100, 150, 100);
    setLocationRelativeTo(null);

    MenuBar menuBar = new MenuBar() {
      @Override
      public void execute(Object obj) {
        redirectExecute(obj);
      }
    };
    setJMenuBar(menuBar);

    JButton button = new JButton("Button");
    button.addActionListener(new ActionListener() {
      @Override
      public void actionPerformed(ActionEvent e) {
        execute("Button");
      }
    });
    getContentPane().add(button);

    setVisible(true);
  }

  void redirectExecute(Object obj) {
    execute(obj);
  }
}

abstract class MenuBar extends JMenuBar implements Callback {
  MenuBar() {
    JMenu fileMenu = new JMenu("Menu");
    add(fileMenu);

    JMenuItem newFileItem = new JMenuItem(new AbstractAction("Menu Item") {
      @Override
      public void actionPerformed(ActionEvent e) {
        execute("Menu Item");
      }
    });
    fileMenu.add(newFileItem);
  }
}

你可以把任何东西调用回MainClass,默认情况下代码永远不会工作,当然可以创建一个构造函数或了解它的设计,顺便问一下,目标是什么第一个目标是将GUI与实际代码分离,第二个目标是使GUI更加模块化。不确定我是否理解了您答复的其他部分。您必须接受您没有访问MainClass公共静态无效主字符串[]参数的权限{,这个类被指定初始化代码,创建一个JVM实例,然后在is not accessible可访问但忘记了之后,我说的是void execute,创建一个标准构造函数public Main{对于对象的私有变量,那么一切都是可能的。我要么误解了我被告知的内容,要么你称之为错误的想法?我看不出有什么好处。我的观点是,你将受到使用这种逻辑的限制。这就是我称之为错误设计的原因,也许在你初始化另一个和编译代码的情况下,您的意思是分离GUI和代码的状态回调将如何帮助您…,同样,您的目标是什么将GUI与实际代码分离==它可以是任何东西