Java JMenuItem ActionListener

Java JMenuItem ActionListener,java,swing,actionlistener,jmenuitem,jmenubar,Java,Swing,Actionlistener,Jmenuitem,Jmenubar,我需要一些关于我的JMenuBar上的ActionListener的帮助 没有错误;但是,每次单击JMenuItem时,它都会触发与JMenuItem关联的所有操作。我的问题是:我在ActionListener代码中做得对吗?我不太确定我的ActionListener类。我试图将ActionListener与按钮逻辑分离 如果有人对我可能做错的事情有任何想法,请指出 这是我的密码: package MenuBar; import java.awt.*; import javax.swing.*;

我需要一些关于我的JMenuBar上的ActionListener的帮助

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

如果有人对我可能做错的事情有任何想法,请指出

这是我的密码:

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。出于测试目的,我只为两个项目实现了它:
ItemNew
ItemOpen
。不幸的是,每次我单击
ItemNew
菜单项时,它都会触发
ItemNew
itemnopen
的操作

以下是我的操作侦听器的代码:

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

}

出于个人喜好,我更喜欢使用API

主要原因是

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


IMHO

我会使用
ActionEvent
getSource
方法,而不是
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());
        }
    }
}

作为一种风格,您应该对变量和方法(menuFile、itemSave、itemOpen等)使用驼峰大小写。类是Pascal case(MenuBarMethod)。我是java新手,无论如何感谢命名约定。所以当你单击“打开”或“新建”时,会弹出一个消息对话框吗?另外,由于MenuBarMethod操作侦听器处理所有操作(至少这两个),因此不需要为每个菜单项创建新实例。创建一个实例并将其添加到菜单项<代码>ActionListener l=new MenubarMethod();openMenuItem.addActionListerner(l);newMenuItem.addActionListener(l)是弹出窗口将显示,顺便说一句,非常感谢它现在正在工作,我尝试了你的代码,我看到我的错误,我只需要实例化actionlistener类一次,并调用它到我的菜单。谢谢,如果您在执行代码后提供JMenu的图片会更好,我通常会使用它,因为它更易于重用。特别是对于经常使用的菜单项,如“保存”、“另存为”、“打开”、“打印”等+1