【问题标题】:Java Event ListenersJava 事件监听器
【发布时间】:2013-05-14 19:33:13
【问题描述】:

我正在尝试将我的 Java 桌面应用程序的组件分成不同的类。例如,我有一个从 MainClass 调用的 MenuBar 类,它创建 JMenuBar。

通常,我会在 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);

}

【问题讨论】:

  • +1 用于知道使用 invokeLater() 来启动 gui 主线程;曾经咬过我。

标签: java event-listener


【解决方案1】:

一种可能的解决方案是MainClass implements ActionListener 并将其实例传递给 MenuBar.createMenu():

public class MenuBar {

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

MainClass 端:

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

另一种方式是使用java.beans.PropertyChangeListenerjava.beans.PropertyChangeSupport

【讨论】:

  • 感谢欧宾,好主意。我会试试的。我还遇到了一个类似的建议,包括在 MainClass 中创建一个新的 ActionListener,然后将其传递给 MenuBar 类。请参阅我上面的编辑
猜你喜欢
  • 1970-01-01
  • 2012-12-09
  • 1970-01-01
  • 1970-01-01
  • 2023-03-14
  • 2018-10-18
  • 1970-01-01
  • 2014-02-21
  • 1970-01-01
相关资源
最近更新 更多