在这个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);
}
}