对的,这是可能的:
>将菜单项存储为字段
>将相同的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);