嵌套回调的模式

时间:2014-04-11 07:28:46

标签: 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.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);
  }
}

0 个答案:

没有答案