Java JMenuItem 动作监听器

2023-11-27

我的 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。出于测试目的,我只针对两个项目实现了它:ItemNew and ItemOpen。不幸的是,每次我点击ItemNew菜单项,它触发两者的操作ItemNew and 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 组件的良好支持。大多数 Swing 组件支持ActionListenerAPI通常提供了提供Action还有(JMenu.add(Action), JMenu(Action) etc)
  • 它使你的代码更容易阅读,更容易阅读单个ActionPerformed的方法Action类然后尝试浏览多个if声明

看一眼如何使用动作

IMHO

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java JMenuItem 动作监听器 的相关文章

随机推荐

  • XML::LibXML 中实现了哪个版本的 XPath?

    有谁知道 XML LibMXL 中实现了哪个版本的 XPath 规范 或者更重要的是 在哪里可以找到可在 LibXML 中使用的 XPath 函数的描述 例如 我尝试过类似的东西 dcDOM gt findvalue dc identifi
  • C 有标准的 ABI 吗?

    来自讨论别的地方 C 没有标准的ABI 应用程序二进制接口 但C也没有 对吗 在任何给定的平台上它几乎都是如此 如果缺乏一种语言 它就无法作为跨语言交流的通用语言 您对此有何看法 C 没有定义 ABI 事实上 它竭尽全力避免定义 ABI 像
  • 如何在sklearn中对分类变量进行编码?

    我正在尝试使用 UCI 存储库中的汽车评估数据集 我想知道是否有一种便捷的方法可以在 sklearn 中对分类变量进行二值化 一种方法是使用 LabelBinarizer 的 DictVectorizer 但在这里我得到了 k 个不同的特征
  • 使用 HBase 进行行分页

    有没有办法在HBase中基于rowkey进行分页 我想要和我一样的效果SQL with SELECT FROM table LIMIT 10 OFFSET 10 如果这是不可能的 我应该如何最好地设计我的行键以进行适当的查询 您可以利用页面
  • 重新分配一次性对象变量是如何工作的?

    在 C 中 当用新对象重新分配一次性对象变量时 它在内存中如何工作 旧对象占用的内存空间会被新对象覆盖吗 或者我还需要打电话吗Dispose 释放它使用的资源 DisposableThing thing thing new Disposab
  • LINQ to Entities Union 引发错误

    我已经成功地完成了以下工作 var transactions from t in context Transactions group t Create Date Time by t Participation Id into t1 sel
  • 如何将类型应用于 NSFetchRequest 实例?

    在 Swift 2 中 以下代码有效 let request NSFetchRequest entityName String 但在 Swift 3 中它给出了错误 无法推断通用参数 ResultType because NSFetchRe
  • 具有默认参数的成员函数指针

    我正在尝试创建一个指向具有默认参数的成员函数的指针 当我通过此函数指针调用时 我不想为默认参数指定参数 根据标准 这是不允许的 但我以前从未发现过任何标准不允许的事情 而我却无法以其他符合标准的方式做到这一点 到目前为止 我还没有找到一种方
  • R 中的简单 if-else 循环

    有人能告诉我 R 中的 if else 循环有什么问题吗 我经常无法让 if else 循环工作 我收到错误 if match SubjResponse names data NA observed lt data SubjResponse
  • 在 C# 中将 4 字节数组转换为浮点数时出现问题

    我正在使用 C 并从某个控制器读取字节数组并将它们转换为其类型 除浮点值外 所有值 int string 都可以 假设得到的值为 533174 1 但是当读取数组时 byteArr 0 2 byteArr 1 73 byteArr 2 98
  • lambda 是否会在内存中保留任何数据?

    我在 AWS lambda 中有以下代码 const cache exports handler async event gt TODO implement if cache event key console log read from
  • 为什么这有效? (在C++中查找奇数)

    for unsigned int i 1 i lt 100 i if i 0x00000001 std cout lt lt i lt lt 为什么 以及如何 if i 0x00000001 找出奇数 0x00000001 is 1尽管它是
  • 无法加载 AppCompat ActionBar,出现未知错误?

    构建 gradle 文件 apply plugin com android application android compileSdkVersion 28 defaultConfig applicationId io dume dume
  • 在 PostgreSQL 中动态生成交叉表列

    我正在尝试创建crosstabPostgreSQL 中的查询 使其自动生成crosstab列而不是对其进行硬编码 我编写了一个函数 可以动态生成我需要的列列表crosstab询问 这个想法是将这个函数的结果替换为crosstab使用动态sq
  • 解析Java源代码

    我被要求开发一个软件 它应该能够创建输入Java源代码的流程图 控制流 于是我开始研究并得出以下解决方案 要创建流程图 控制流 我必须识别给定源代码中的控制语句和函数调用现在我有两种识别方法 通过编写我自己的语法来解析源代码 我认为这是一个
  • 如何从外部软件调用证明助手Coq

    如何从外部软件调用证明助手Coq Coq 有一些 API 吗 Coq 命令行界面是否足够丰富 可以在文件中传递参数并在文件中接收响应 我对 Java 或 C 桥感兴趣 这是合理的问题 Coq 并不是一种常见的商业软件 人们可以从中获得开发人
  • 如何将匿名类型作为参数传递?

    如何将匿名类型作为参数传递给其他函数 考虑这个例子 var query from employee in employees select new Name employee Name Id employee Id LogEmployees
  • 全局 var 与共享实例 swift

    Swift 中的全局变量和共享实例有什么区别 它们各自的使用领域是什么 任何人都可以根据 Swift 澄清他们的概念吗 全局变量是在文件顶层声明的变量 所以如果我们有一个名为Bar 您可以存储对实例的引用Bar在这样的全局变量中 var b
  • 为什么材质 FAB 在禁用时不改变颜色?

    我正在禁用材质浮动操作按钮 但当禁用设置为 true 时 颜色不会改变 我认为 Material 有一个 FAB 主题 禁用后它应该变成浅灰色 我不想在每次启用 禁用背景时添加代码来更改背景 我目前使用的材料版本 1 1 0 在代码中我只是
  • Java JMenuItem 动作监听器

    我的 JMenuBar 上的 ActionListener 需要一些帮助 没有错误 但是 每次我单击 JMenuItem 时 它都会触发与 JMenuItem 关联的所有操作 我的问题是 我在 ActionListener 代码中做得正确吗