Java デスクトップ アプリのコンポーネントを異なるクラスに分離しようとしています。たとえば、MainClass から呼び出され、JMenuBar を作成する MenuBar クラスがあります。
通常は、MenuBar クラスに ActionListener を実装し、actionPerformed() をオーバーライドして、すべてを整理します。しかし、それを行う場合、何がクリックされたかを MainClass に知らせるにはどうすればよいでしょうか?
独自の ActionListener を実装しようとしましたが、イベントを他のクラスにディスパッチできるソリューションを思いつくことができませんでした。
MainClass.java
public class MainClass extends JFrame {
private static void createAndShowGUI() {
JFrame.setDefaultLookAndFeelDecorated(false);
JFrame frame = new JFrame("Main Window");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
MenuBar menuBar = new MenuBar();
JMenuBar mb = menuBar.createMenu();
frame.setJMenuBar(mb);
frame.setSize(400,400);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
}
MenuBar.java
public class MenuBar implements ActionListener {
public JMenuBar createMenu() {
JMenu menu;
JMenuItem item;
JMenuBar menuBar = new JMenuBar();
menu = new JMenu("Main");
menuBar.add(menu);
item = new JMenuItem("New");
menu.add(item);
return menuBar;
}
@Override
public void actionPerformed(ActionEvent e) {
JMenuItem source = (JMenuItem)(e.getSource());
System.out.println("Action triggered on: "+source.getText());
// *** Let MainClass know what was clicked ??
}
}
編集
次のように、MainClass で ActionListener を作成し、それを MenuBar クラスに渡すだけでよいことに気付きました。
修正された MainClass.java
ActionListener l = new ActionListener() {
public void actionPerformed(ActionEvent ae) {
System.out.println(ae.getActionCommand());
}
};
MenuBar menuBar = new MenuBar();
frame.setJMenuBar(menuBar.createMenu(l));
次に、MenuBar で、各メニュー項目に ActionListener を適用するだけです。
修正された MenuBar.java
public JMenuBar createMenu(ActionListener l) {
item = new JMenuItem("Hide When Minimized");
item.addActionListener(l);
menu.add(item);
}