草庐IT

Java JMenuItem Action 监听器

coder 2024-03-16 原文

我的 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 的操作。

这是我的 Action 监听器的代码:

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接口(interface)

主要原因是

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

看看How to Use Actions

恕我直言

关于Java JMenuItem Action 监听器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11980151/

有关Java JMenuItem Action 监听器的更多相关文章

  1. ruby-on-rails - Rails 是否支持监听 UDP 套接字的简洁方式? - 2

    在Rails中,什么是集成更新模型某些元素的UDP监听过程的最佳方式(特别是它将向其中一个表添加行)。简单的答案似乎是在同一个进程中使用UDP套接字对象启动一个线程,但我什至不清楚我应该在哪里做适合Rails方式的事情。有没有一种巧妙的方法来开始收听UDP?具体来说,我希望能够编写一个UDPController并在每个数据报消息上调用一个特定的方法。理想情况下,我希望避免在UDP上使用HTTP(因为它会浪费一些在这种情况下非常宝贵的空间),但我完全控制消息格式,因此我可以为Rails提供它需要的任何信息。 最佳答案 Rails是一个

  2. ruby-on-rails - 有没有办法阻止 Rails 的内置服务器默认监听 0.0.0.0? - 2

    我在不受信任的网络(咖啡店、邻居的开放式wifi、DEFCON)上进行了大量的Web开发,当随机的、肯定有错误的软件(比如我正在开发的Rails应用程序)在0.0上绑定(bind)一个端口时,我会感到紧张.0.0并开始接受所有来者的请求。我知道我可以使用-b选项指定绑定(bind)到服务器的地址,但我想全局更改默认值,以便它始终以这种方式运行,除非我另有说明。当然我也可以运行某种会阻止连接的防火墙,但最好不要一开始就监听。是否有“.railsrc”文件或类似文件——至少是每个项目的设置文件,但最好是一些全局设置文件——我可以使用它来强制服务器默认仅绑定(bind)到127.0.0.1?

  3. javascript - 窗口上的事件监听器不会删除 - 2

    这个问题在这里已经有了答案:JavaScript:removeeventlistener(10个答案)关闭7年前。我需要删除在窗口上设置的事件监听器,但它不起作用,监听器一直在滚动时触发。我试过设置有和没有lodashthrottle的听众,但它没有任何区别。这是我的代码:setupListener(){window.addEventListener('resize',_.throttle(this.handler.bind(this),750));window.addEventListener('scroll',_.throttle(this.handler.bind(this),7

  4. javascript - 是否使用 ".click()"异步触发事件监听器? - 2

    我有以下代码(我的HTML中有一个):(function(){'usestrict';document.getElementById(7).addEventListener("click",function(){console.log('clicked');})console.log('before');document.getElementById(7).click();console.log('after')}());当它在Firefox41控制台中运行时,我会预料到之前之后点击因为代码会同步运行,然后在完成脚本后响应事件队列中的点击事件。相反,我得到了之前点击在之后这表明事件正在

  5. javascript - 如何将拖放事件监听器附加到 React 组件 - 2

    我正在构建一个允许将本地文件拖放到div上的组件。然后会输出有关已删除文件的信息。我的问题是在创建组件时我不知道如何正确附加事件监听器drop和dragover。我的App组件是我所有逻辑所在的地方(拖放和拖动的处理程序),我创建了一个单独的组件,文件将被放置在该组件上-dropZone组件。我尝试使用componentDidMount将事件监听器放在我的App组件上的dropZone标记上,如果我的dropZone组件已呈现,则在其上放置一个事件监听器:componentDidMount(){constdropZone=document.getElementById('dropZon

  6. javascript - 如何找出是否有正在监听键盘事件的 Javascript 代码? - 2

    如何确定是否有Javascript代码监听/拦截键盘事件,并理想地找到代码中的确切行/位置(例如在ChromeDev工具中)? 最佳答案 我的答案是针对Chrome浏览器如果您需要查看在对象上注册的事件监听器,那么您可以使用getEventListeners(object)如果您需要监控事件,请使用monitorEvents()您可以阅读moreabouttheseAPI您还可以从开发工具中观察这些事件 关于javascript-如何找出是否有正在监听键盘事件的Javascript代码?

  7. javascript - 提交表单的事件监听器 - 2

    我为表单提交编写了一个事件监听器,这导致我出现了一些问题。在文本字段内按“输入”时,一切正常。但是,我有一个跨度(带有背景图像)也可以通过单击事件提交表单。这无法正常工作,我不明白为什么。这是基本的HTML:这是事件监听器的JS:functionevtSubmit(e){//codee.preventDefault();};varmyform=document.myForm;if(myform.addEventListener){myform.addEventListener('submit',evtSubmit,false);}这是“跨度”及其点击事件的JS:varsearchBut

  8. javascript - Chrome onMessage 监听器没有被调用 - 2

    我正在试验chrome.extensionAPI。list.json{"name":"First","version":"1.0","manifest_version":2,"description":"Firstextension","background":{"scripts":["test.js"]},"page_action":{"default_icon":"icon.png","default_popup":"popup.html"},"content_scripts":[{"js":["jquery.min.js","display.js"],"matches":["ht

  9. javascript - ".on()" Action 监听器似乎停止工作 - 2

    我想我会从linktoajsfiddleofmyproject开始我将解释它应该如何工作以及我的主要问题。基本上,它在顶部由一个选择器框描绘了三个“线”。每行都有不同数量的“部分”,它们显示在左侧栏中。当一个部分被选中时,一个表单会向上滑动以输入信息(但现在可以忽略)。提交后,应将新的“工作”添加到列表中。到目前为止一切正常。当我切换线路时,我的问题就来了。出于某种原因,每当我从默认的第一行切换行时,我就无法再将工作添加到列表中。我的.on()监听器根本无法识别我正在单击按钮。基本上,我是一名从事高级设计项目的工科学生,必须自学所有这些网络编程知识,因为这是客户想要的(即使它不完全属于

  10. javascript - 在谷歌地图上监听键盘事件 - 2

    我的应用程序中有Googlemap,我使用map在其上绘制折线。我想在谷歌地图上听键盘事件,这样说如果我在绘制Polyline时按下Esc键,它应该停止绘制(它应该重置DrawingMode)。我通过两种方式尝试了这个。1.我将keyevents添加到它的容器中:bindKeyEventsForMapButtons:function(btn){varme=this;btn.el.dom.onkeydown=function(e){if(btn.getId()=='drawPerimeterGoogleMap'){if(btn.pressed==true)btn.toggle(false

随机推荐