Java JMenuItem ActionListener
我需要一些关于我的JMenuBar上的ActionListener的帮助 没有错误;但是,每次单击JMenuItem时,它都会触发与JMenuItem关联的所有操作。我的问题是:我在ActionListener代码中做得对吗?我不太确定我的ActionListener类。我试图将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.*;
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组件的良好支持。大多数支持
API的Swing组件通常也提供了提供ActionListener
操作的方法(
,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