Java JMenuItem ActionListener

我的JMenuBar上的ActionListener需要一些帮助。

没有错误; 但是每次单击JMenuItem时,它都会触发与JMenuItem关联的所有操作。 我的问题是:我在ActionListener代码中做得对吗? 我对ActionListener类不太确定。 我正在尝试将我的ActionListener与Button逻辑分开。

如果有人对我可能做错了什么有任何想法,请指出。

这是我的代码:

package MenuBar; import java.awt.*; import javax.swing.*; import java.awt.event.*; public class SimpleMenuBar{ private static final LayoutManager grid = new GridLayout(0, 1); public JMenuBar MenuBar; public JMenu MenuFile, MenuEdit, MenuOption; public JMenuItem ItemNew, ItemOpen, ItemSave, ItemExit, ItemCopy, ItemCut, ItemPaste; ButtonGroup direction; JRadioButtonMenuItem forwardradio, backwardradio; JCheckBoxMenuItem CheckCase; String input = null; public void Design() { JFrame frame = new JFrame("Simple Menubar"); frame.setSize(320, 320); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); MenuBar = new JMenuBar(); frame.setJMenuBar(MenuBar); MenuBar.setLayout(grid); //Menus MenuFile = new JMenu("File"); MenuFile.setMnemonic(KeyEvent.VK_F); MenuBar.add(MenuFile); //sub Menus ItemNew = new JMenuItem("New", KeyEvent.VK_N); MenuFile.add(ItemNew); ItemNew.setActionCommand("New"); ItemNew.addActionListener(new MenuBarMethod()); ItemOpen = new JMenuItem("Open", KeyEvent.VK_O); MenuFile.add(ItemOpen); ItemOpen.setActionCommand("Open"); ItemNew.addActionListener(new MenuBarMethod()); MenuFile.addSeparator(); ItemSave = new JMenuItem("Save", KeyEvent.VK_S); MenuFile.add(ItemSave); MenuFile.addSeparator(); ItemExit = new JMenuItem("Exit", KeyEvent.VK_X); MenuFile.add(ItemExit); MenuEdit = new JMenu("Edit"); MenuFile.setMnemonic(KeyEvent.VK_E); MenuBar.add(MenuEdit); ItemCopy = new JMenuItem("Copy", KeyEvent.VK_C); KeyStroke ctrlCKeyStroke = KeyStroke.getKeyStroke("control C"); ItemCopy.setAccelerator(ctrlCKeyStroke); MenuEdit.add(ItemCopy); ItemCut = new JMenuItem("Cut", KeyEvent.VK_V); KeyStroke ctrlVKeyStroke = KeyStroke.getKeyStroke("control V"); ItemCut.setAccelerator(ctrlVKeyStroke); MenuEdit.add(ItemCut); ItemPaste = new JMenuItem("Paste", KeyEvent.VK_Y); KeyStroke ctrlYKeyStroke = KeyStroke.getKeyStroke("control Y"); ItemPaste.setAccelerator(ctrlYKeyStroke); ItemPaste.setEnabled(false); MenuEdit.add(ItemPaste); MenuEdit.addSeparator(); MenuOption = new JMenu("Option"); Icon atIcon = new ImageIcon("option.png"); MenuOption.setIcon(atIcon); MenuOption.setMnemonic(KeyEvent.VK_O); direction = new ButtonGroup(); forwardradio = new JRadioButtonMenuItem("Forward Me", true); forwardradio.setMnemonic(KeyEvent.VK_F); MenuOption.add(forwardradio); direction.add(forwardradio); MenuEdit.add(MenuOption); backwardradio = new JRadioButtonMenuItem("Backward Me"); backwardradio.setMnemonic(KeyEvent.VK_B); MenuOption.add(backwardradio); direction.add(backwardradio); MenuOption.addSeparator(); CheckCase = new JCheckBoxMenuItem("Case Sensitive"); MenuOption.add(CheckCase); direction.add(CheckCase); MenuEdit.add(MenuOption); } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable(){ public void run() { SimpleMenuBar MyMenu = new SimpleMenuBar(); MyMenu.Design(); } }); } } 

对于一个菜单栏来说,这是一个非常多的代码。 我还没有完全实现ActionListener。 出于测试目的,我只为两个项目实现了它: ItemNewItemOpen 。 不幸的是,每次我点击ItemNew菜单项时,它都会触发ItemNew ItemOpen的动作。

以下是我的动作监听器的代码:

 package MenuBar; import java.awt.event.*; import javax.swing.JOptionPane; public class MenuBarMethod implements ActionListener{ public void actionPerformed(ActionEvent e) { if("New".equals(e.getActionCommand())){ JOptionPane.showMessageDialog(null, "Selected Item: " + e.getActionCommand()); } if("Open".equals(e.getActionCommand())){ JOptionPane.showMessageDialog(null, "Selected Item: " + e.getActionCommand()); } } } 

作为个人喜好,我更喜欢使用Action API

主要原因是

  • 它集中了与特定动作相关的逻辑,包括名称,击键,快捷方式,图标等
  • 它是可重复使用的。 创建一个Action对象然后重新创建菜单项和工具栏项以及弹出菜单项要容易得多
  • 其他Swing组件也很好地支持它。 支持ActionListener API的大多数Swing组件通常也提供了提供Action方法( JMenu.add(Action)JMenu(Action)等)
  • 它使您的代码更易于阅读,更容易阅读Action类的单个ActionPerformed方法然后尝试并浏览多个if语句

看看如何使用动作

恕我直言

我会使用ActionEventgetSource方法而不是getActionCommand

 public class MenuBarMethod implements ActionListener{ public void actionPerformed(ActionEvent e) { if(e.getSource() == ItemNew){ JOptionPane.showMessageDialog(null, "Selected Item: " + e.getActionCommand()); } if(e.getSource() == ItemOpen){ JOptionPane.showMessageDialog(null, "Selected Item: " + e.getActionCommand()); } } }