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 动作监听器 的相关文章

  • 启动 Java 时使用 -d32 和 -d64

    我阅读了以下摘录JDK 常见问题解答 http www oracle com technetwork java hotspotfaq 138619 html 64bit layering 如何在 32 位和 64 位操作之间进行选择 默认是
  • 一般如何处理 CXF 请求处理程序中的输入参数?

    我一直在使用 apache CXF 版本 2 2 2 JAX RS 进行一些工作 我试图在调用业务方法之前在 CXF 请求处理程序中引入数据验证层 幸运的是 我在请求处理程序 DataValidationHandler 中遇到输入参数处理问
  • 将图像作为 JPanel 的背景

    我是 Java 新手 目前正在创建一个带有图形的游戏 我有这个课程从JFrame 在这个班级里 我有很多JPanel需要图像作为背景 据我所知 为了能够在 JPanel 中绘制图像 我需要一个从 JPanel 扩展的单独的类以及该类的pai
  • 是什么使得 java 中的枚举不可实例化?

    我知道一个枚举 enum Year First Second Third Fourth 被转换成 final class Year extends Enum
  • Maven 管理的 Java EE 应用程序中 JBoss 提供的库

    这对我来说实际上不太可能 但网上似乎没有关于将 JBoss 提供的依赖项导入 Maven 管理的 Java EE 应用程序以在其中部署的直接答案 据我所知 有两件事与这个问题有关 那就是jboss as client外部 就 JVM 而言
  • 用于将字符串与预定义字符混合/混淆的简单算法

    我有一个字符串如下 它的长度是10 它代表基数 36 因此包含数字和大写字母 字符串的来源是数据库生成的序列 即从 1 及以上 正在转换为基数 36 我的问题是转换为base 36转换的结果也是连续 顺序的 例如 ID 1402 gt 00
  • 为什么需要使用java.util.TimerTask的purge()?

    Timer cancel 取消任务 Timer purge 从此计时器的任务队列中删除所有已取消的任务 如果我不在这里使用 purge 会发生什么 当计时器的任务队列已满时会发生什么 除非您正在运行的计时器数量过多 否则实际计时器行为不会发
  • getAnnotations() 为空

    我想在我的应用程序中使用注释 因此 我为注释创建了 hello world 如下示例 public class HelloAnnotation Foo bar Hello World public String str public sta
  • 二维数组中的寻路

    假设我有这个二维数组地图 0 0 0 0 7 1 1 1 1 1 1 1 1 0 7 7 7 7 1 1 1 24 1 1 1 1 0 7 24 24 24 24 24 24 24 1 1 3 1 0 7 23 23 23 23 23 23
  • java.util.Objects 与Optional 哪个更可取?

    The java util Objects http download java net java jdk9 docs api java util Objects html类通过许多新方法进行了扩展 对象 requireNonNullEls
  • 带有 CONTAINS 查询的PreparedStatement

    我有一个查询需要连续运行 28000 次 所以我认为使用准备好的语句可能是一个聪明的主意 这是我的查询 String requestWithFirstName SELECT SE ELEMENT ID SE LASTNAME SE FIRS
  • 无法渲染非字符串的属性,toString 返回:null SPRING MVC 中的错误

    我正在尝试按照本教程为我的 spring mvc 项目创建一个通用错误处理程序 http www mkyong com spring mvc spring mvc exceptionhandler example http www mkyo
  • 如何从 Java 类调用 Kotlin 类

    我需要将意图从 java 活动传递到 Kotlin 活动 Java活动ProfileActivity class Intent selectGameIntent new Intent ProfileActivity this kotlin
  • java POI XSSF 公式评估器

    我在保存新的 Excel 文件时遇到问题 我希望当它被保存时 公式会自行计算 但目前它只是返回 Excel 文件中的一个字符串 公式是正确的 我不知道到底要得到FormulaEvaluator上班 这是我输入返回字符串的公式的地方 data
  • 使用服务器 java api 从 jasperserver 存储库检索资源

    我正在尝试使用其 java API 从 Jasperserver 存储库检索资源 根据jasper 报表服务器终极指南 https community jaspersoft com documentation jasperreports s
  • Android 布局崩溃

    I use a XWalkView https crosswalk project org 加载网页和视频查看器 https github com Bilibili ijkplayer在我的应用程序中播放实时视频 我希望 IjkVideoV
  • Java中如何对整数除法进行四舍五入并得到int结果? [复制]

    这个问题在这里已经有答案了 我刚刚写了一个小方法来计算手机短信的页数 我没有选择使用Math ceil 老实说 它看起来很丑陋 这是我的代码 public class Main param args the command line arg
  • 如何为 Weblogic 10.3.6 启用 Java 持久性 2.0

    我正在使用 eclipse 和 weblogic 服务器 为了将项目添加到 weblogic 服务器 它需要支持 Java Persistance 2 0 但是当尝试安装它时 我不断收到此消息 在 Weblogic Server 安装中启用
  • 在同一项目上使用 Eclipse 和 NetBeans

    Eclipse 是一个非常棒的编辑器 我更喜欢使用它 但是缺少 Eclipse 的 GUI 设计工具 另一方面 NetBeans 非常适合 GUI 设计 在同一项目中使用 NetBeans 进行 GUI 设计和 Eclipse 进行其他所有
  • 在 Eclipse Testrunner 中使用名称的 ParameterizedTest

    当您使用 Eclipse TestRunner 运行 JUnit 4 ParameterizedTest 时 图形表示相当愚蠢 对于每个测试 您都有一个名为 0 1 ETC 是否可以进行测试 0 1 等显式名称 实施一个toString测试

随机推荐

  • 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 代码中做得正确吗