4

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);

}
4

1 に答える 1

3

考えられる解決策の 1 つはMainClass implements ActionListener、そのインスタンスを MenuBar.createMenu() に渡すことです。

public class MenuBar {

   public JMenuBar createMenu( ActionListener l ) {
      ...
      menuItem.addActionListener( l );
   }
   ...
}

メインクラス側:

public class MainClass extends JFrame {

   @Override
   public void actionPerformed(ActionEvent e) {
      Object source = e.getSource();
      System.out.println( "Action triggered by: " + source );
   }

   private static void createAndShowGUI() {
      ...
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      MenuBar menuBar = new MenuBar();
      JMenuBar mb = menuBar.createMenu( frame );
      frame.setJMenuBar( mb );
      ...
   }
}

もう 1 つの方法は、 java.beans.PropertyChangeListenerjava.beans.PropertyChangeSupportを使用することです。

于 2013-05-14T19:49:40.077 に答える