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