Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 侦听所有菜单项的JFrame操作侦听器?_Java_Swing_Jframe_Jmenuitem - Fatal编程技术网

Java 侦听所有菜单项的JFrame操作侦听器?

Java 侦听所有菜单项的JFrame操作侦听器?,java,swing,jframe,jmenuitem,Java,Swing,Jframe,Jmenuitem,因此,我有一个JFrame,它设置了一个菜单,当前结构如下: File Exit Pages Reviews A B C Help About 我想创建一个操作侦听器,它只侦听正在审阅的菜单项。这是一种可能性(如果是,如何实现),还是我必须创建一个通用侦听器并检查它是否属于这些项目之一?是的,这是可能的: 将菜单项存储为字段 向每个菜单项添加相同的ActionListener 在侦听器中,检查源以了解单击了哪个项 应该是这样的: public class

因此,我有一个JFrame,它设置了一个菜单,当前结构如下:

File
  Exit
Pages
  Reviews
    A
    B
    C
Help
  About
我想创建一个操作侦听器,它只侦听正在审阅的菜单项。这是一种可能性(如果是,如何实现),还是我必须创建一个通用侦听器并检查它是否属于这些项目之一?

是的,这是可能的:

  • 将菜单项存储为字段
  • 向每个菜单项添加相同的
    ActionListener
  • 在侦听器中,检查源以了解单击了哪个项
应该是这样的:

public class YourFrame extends JFrame implements ActionListener {

   private final JMenuItem menuA, menuB;

   public YourFrame(){
      super("Your app");
      JMenuBar menuBar = new JMenuBar();
      JMenu menuReviews = new JMenu("Reviews");
      menuA = new JMenuItem("A");
      menuB = new JMenuItem("B");
      ...
      menuReviews.add(menuA);
      menuReviews.add(menuB);
      menuBar.add(menuReviews);
      setJMenuBar(menuBar);
      ...
      menuA.addActionListener(this);
      menuB.addActionListener(this);
      ...
   }

   public void actionPerformed(ActionEvent event){
      if(event.getSource()==menuA){
         System.out.println("Menu A clicked");
         ...
      }else if(event.getSource()==menuB){
         System.out.println("Menu B clicked");
         ...
      }
   }

}
注意,这里我让
JFrame
实现
ActionListener
,但这只是为了方便。可以使用专用类,也可以使用构造函数中创建的匿名类:

ActionListener reviewsListener = new ActionListener(){
   public void actionPerformed(ActionEvent event){
      if(event.getSource()==menuA){
         System.out.println("Menu A clicked");
         ...
      }else if(event.getSource()==menuB){
         System.out.println("Menu B clicked");
         ...
      }
   }
};
menuA.addActionListener(reviewsListener);
menuB.addActionListener(reviewsListener);
如果您想进一步集成这个过程,我还可以建议扩展
JMenu
,这样您就可以将其传递给动作侦听器,并将其系统地添加到新的菜单项中

public class YourJMenu extends JMenu {
   private ActionListener listener;
   public YourJMenu(String name, ActionListener listener){
      super(name);
      this.listener = listener;
   }
   @Override
   public JMenuItem add(JMenuItem item){
      item.addActionListener(listener);
      return super.add(item);
   }
}
有了这个,你只需要写:

JMenu menuReviews = new YourJMenu("Reviews", this);
并删除:

menuA.addActionListener(this);
menuB.addActionListener(this);

使用通用方法,我们可以将动作侦听器添加到菜单下的所有菜单项。下面是一个示例代码

public class MenuItemEvent {
    JFrame objFrm = new JFrame("Menu event demo");
    JMenuBar mBar;
    JMenu mnu;
    JMenuItem mnuItem1, mnuItem2, mnuItem3;
    public void show() {
        objFrm.setSize(300, 300);
        mBar = new JMenuBar();
        mnu = new JMenu("Reviews");
        mBar.add(mnu);

        mnuItem1 = new JMenuItem("A");
        mnu.add(mnuItem1);

        mnuItem2 = new JMenuItem("B");
        mnu.add(mnuItem2);

        mnuItem3 = new JMenuItem("C");
        mnu.add(mnuItem3);

        //method call
        fnAddActionListener(mnu);

        objFrm.setJMenuBar(mBar);
        objFrm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        objFrm.setVisible(true);
    }

    //method to add action listener to all menu items under a menu
    public void fnAddActionListener(JMenu mnu) {
        if (mnu.getItemCount() != 0) {
            for (int iCount = 0; iCount < mnu.getItemCount(); iCount++) {
                (mnu.getItem(iCount)).addActionListener(new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        fnMenuItemAction(e);
                    }
                });
            }
        }
    }

    //menu item action event
    public void fnMenuItemAction(ActionEvent e) {
        if (e.getSource().equals(mnuItem1)) {
            System.out.println("Menu Item 1");
        } else if (e.getSource().equals(mnuItem2)) {
            System.out.println("Menu Item 2");
        } else if (e.getSource().equals(mnuItem3)) {
            System.out.println("Menu Item 3");
        }
    }

    public static void main(String[] args) {
        new MenuItemEvent().show();
    }
}

在您的情况下,您不认为应该使用
MenuListener
而不是
ActionListener
@OSryx我使用的是JMenuItem,不是jMenus。
//fnMenuItemAdd(mnu,mnuItem1)
//etc.

public void fnMenuItemAdd(JMenu mnu, JMenuItem mni) {
    mnu.add(mni);
    mni.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            fnMenuItemAction(e);
        }
    });
}