如何为 JMenu 子菜单设置加速器?

2024-01-07

我有一个用户请求将加速器添加到子菜单(JMenu),这将允许用户按下快捷键并使相应的子菜单“折叠”,显示其包含的菜单项。

我不记得每个人都见过这样的东西(无论是在 Java 还是任何其他语言中)。我们的应用程序是使用 Swing 用 Ja​​va 编写的。我们有许多带有运行良好的加速器的 JMenuItems,但是当我尝试向 JMenu 添加加速器时,出现以下异常:

java.lang.Error: setAccelerator() 没有为 JMenu 定义。请改用 setMnemonic()。

我尝试过使用MenuDemo http://docs.oracle.com/javase/tutorial/uiswing/examples/components/MenuDemoProject/src/components/MenuDemo.java!代码来进一步试验这一点。

这是我尝试过的:

//a submenu
menu.addSeparator();
submenu = new JMenu("A submenu");
submenu.setMnemonic(KeyEvent.VK_S);
submenu.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_U, InputEvent.CTRL_MASK));

最后一行是我添加的,这导致了异常。

我尝试过广泛的谷歌搜索,但我所能找到的只是有关如何向 JMenuItem 添加加速器的文章。

JMenu 似乎本身不支持此功能。有什么解决方法可以实现这种行为吗?


另一种选择是覆盖加速器获取/设置并重现 JMenuItem 行为。然后 UI 将完成剩下的工作。

重要的是触发属性更改并为加速器提供一致的获取/设置。该解决方案的优点是它还提供快捷方式/加速器的视觉指示。

这是一个小演示代码:

import java.awt.event.KeyEvent;

import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.KeyStroke;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class TestMenu {

    protected void initUI() {
        JFrame frame = new JFrame(TestMenu.class.getSimpleName());
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JMenuBar bar = new JMenuBar();
        JMenu topMenu = new JMenu("Top Menu");
        JMenu subMenu = new JMenu("Sub menu") {
            private KeyStroke accelerator;

            @Override
            public KeyStroke getAccelerator() {
                return accelerator;
            }

            @Override
            public void setAccelerator(KeyStroke keyStroke) {
                KeyStroke oldAccelerator = accelerator;
                this.accelerator = keyStroke;
                repaint();
                revalidate();
                firePropertyChange("accelerator", oldAccelerator, accelerator);
            }
        };
        subMenu.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F4, KeyEvent.CTRL_MASK));
        JMenuItem item1 = new JMenuItem("Item 1");
        JMenuItem item2 = new JMenuItem("Item 2");
        subMenu.add(item1);
        subMenu.addSeparator();
        subMenu.add(item2);
        topMenu.add(subMenu);
        bar.add(topMenu);
        frame.setJMenuBar(bar);
        frame.setSize(400, 300);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (InstantiationException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (IllegalAccessException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (UnsupportedLookAndFeelException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                new TestMenu().initUI();
            }
        });
    }

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

如何为 JMenu 子菜单设置加速器? 的相关文章

  • HashMap不写入数据库

    我尝试在我的数据库中写入 但只写入发件人和消息 我不明白为什么会发生这种情况 我认为问题出在我使用 sendMessage 的地方 我认为问题是我没有什么可以做的读 写其他用户的主键 我在数据库中写入消息的活动 public class M
  • Java Try Catch Final 没有 Catch 的情况下会阻塞

    我正在审查一些新代码 该程序只有一个 try 和一个 finally 块 既然排除了 catch 块 那么如果 try 块遇到异常或任何可抛出的内容 它如何工作 它直接进入finally块吗 如果 try 块中的任何代码可以引发已检查异常
  • 使用 GWT CellTableBuilder 构建树表

    Is it possible to build a tree table like this http www sencha com examples ExamplePlace basictreegrid with the new Cell
  • “_加载小部件时出现问题”消息

    加载小部件时 如果找不到资源或其他内容 则会显示 加载小部件时出现问题 就这样 惊人的 此消息保留在主屏幕上 甚至没有说明加载时遇到问题的小部件 我通过反复试验弄清楚了这一点 但我想知道发生这种情况时是否有任何地方可以找到错误消息 Andr
  • 如何在spring mvc中从控制器名称+操作名称获取映射的URL?

    是否有现有的解决方案可以从 Spring MVC3 中的 控制器名称 操作名称 获取映射的 URL 例如 asp net mvc 或 Rails 中的 UrlHelper 我觉得非常有用 thx 也许 你想要这样的东西 in your Co
  • 如何使用 SimpleDateFormat 解析多种格式的日期

    我正在尝试解析文档中的一些日期 用户似乎以类似但不完全相同的格式输入了这些日期 以下是格式 9 09 9 2009 09 2009 9 1 2009 9 1 2009 尝试解析所有这些内容的最佳方法是什么 这些似乎是最常见的 但我想让我困扰
  • eclipse中导入项目文件夹图标

    我在 Eclipse 工作区中新导入的 Maven 项目有J and M项目文件夹顶部的图标 项目和包资源管理器 而其他导入的 Maven 项目只有一个J icon 有人可以解释其中的区别吗 该项目有J装饰器被称为 Java 项目和具有M装
  • 如何在 JSP 中导入类?

    我是一个完全的JSP初学者 我正在尝试使用java util List在 JSP 页面中 我需要做什么才能使用除以下类之外的类java lang 使用以下导入语句进行导入java util List 顺便说一句 要导入多个类 请使用以下格式
  • 如何获取 WebElement 的父级[重复]

    这个问题在这里已经有答案了 我试过了 private WebElement getParent final WebElement webElement return webElement findElement By xpath 但我得到
  • 将表值参数与 SQL Server JDBC 结合使用

    任何人都可以提供一些有关如何将表值参数 TVP 与 SQL Server JDBC 一起使用的指导吗 我使用的是微软提供的6 0版本的SQL Server驱动程序 我已经查看了官方文档 https msdn microsoft com en
  • Java 8 中函数式接口的使用

    这是来自的后续问题Java 8 中的 双冒号 运算符 https stackoverflow com questions 20001427 double colon operator in java 8其中 Java 允许您使用以下方式引用
  • Java 数组的最大维数

    出于好奇 在 Java 中数组可以有多少维 爪哇language不限制维数 但是JavaVM规范将维度数限制为 255 例如 以下代码将无法编译 class Main public static void main String args
  • Android Studio 将音乐文件读取为文本文件,如何恢复它?

    gameAlert mp3是我的声音文件 运行应用程序时 它询问我该文件不与任何文件类型关联 请定义关联 我选择TextFile错误地 现在我的音乐文件被读取为文本文件 我如何将其转换回music file protected void o
  • 逃离的正确方法是什么?使用 Oracle 12c MATCH_RECOGNIZE 时 JDBCPreparedStatement 中的字符?

    以下查询在 Oracle 12c 中是正确的 SELECT FROM dual MATCH RECOGNIZE MEASURES a dummy AS dummy PATTERN a DEFINE a AS 1 1 但它不能通过 JDBC
  • 为什么java中的for-each循环中需要声明变量

    for 每个循环的通常形式是这样的 for Foo bar bars bar doThings 但如果我想保留 bar 直到循环结束 我可以not使用 foreach 循环 Foo bar null Syntax error on toke
  • Linux 上有关 getBounds() 和 setBounds() 的 bug_id=4806603 的解决方法?

    在 Linux 平台上 Frame getBounds 和 Frame setBounds 的工作方式不一致 这在 2003 年就已经有报道了 请参见此处 http bugs java com bugdatabase view bug do
  • Java:拆箱整数时出现空指针异常?

    此代码导致空指针异常 我不知道为什么 private void setSiblings PhylogenyTree node Color color throws InvalidCellNumberException PhylogenyTr
  • JSON 到 hashmap (杰克逊)

    我想将 JSON 转换为 HashMapJackson http jackson codehaus org 这是我的 JSON String json Opleidingen name Bijz trajecten zorg en welz
  • 在android中跟踪FTP上传数据?

    我有一个运行 Android 的 FTP 系统 但我希望能够在上传时跟踪字节 这样我就可以在上传过程中更新进度条 安卓可以实现这个功能吗 现在 我正在使用org apache common net ftp我正在使用的代码如下 另外 我在 A
  • JAXB - 列表<可序列化>?

    我使用 xjc 制作了一些课程 public class MyType XmlElementRefs XmlElementRef name MyInnerType type JAXBElement class required false

随机推荐

  • 在emacs中使用pdb时如何指定路径?

    我正在尝试在 emacs 中使用 pdb 我需要更改路径PYTHONPATH lib 但是当我输入时 Run pdb like this PYTHONPATH lib pdb pychess Emacs 给我一个错误 说找不到文件 PYTH
  • sqlQuery 的 RODBC 错误处理

    我没有找到任何好的错误测试函数来测试结果sqlQuery这让我很惊讶 在文档中 http www inside r org packages cran rodbc docs sqlQuery http www inside r org pa
  • 使用 PHP 显示 MySQL 数据库中的所有表?

    我正在尝试显示数据库中的所有表 我试过这个 sql SHOW TABLES result conn gt query sql tables result gt fetch assoc foreach tables as tmp echo t
  • _var 和 self.var 之间的区别

    随着所有这些新的 ARC 内容 不属于 NDA 的出现 处理属性的默认设置似乎是在实现文件中显式设置没有 ivar 的属性 直到您使用以下内容综合它 synthesize var var 设置变量的最佳实践是什么 我知道之间的区别var a
  • 将 [(key: String, value: String)] 转换为 [String:String]

    我想将 key String value String 转换为 String String 可以吗 如果是的话我怎么做 谢谢 var KeyValuePair key String value String key 2017 01 04 v
  • 检查输入时出错:预期dense_input的形状为(21,),但得到的数组的形状为(1,)

    如何修复输入数组以满足输入形状 我尝试转置输入数组 如上所述here https stackoverflow com questions 50336110 valueerror error when checking expected de
  • ACE oleDb 驱动程序无法处理巨大的 Excel 文件

    ACE OLEDB 驱动程序对于较大的文件是否存在任何已知问题 我使用下面的代码来检索 400Mb xls 文件中的工作表 public string GetWorkSheets var connectionString Provider
  • C# 中 (int) 和 Convert.toint32 之间的区别

    当我将对象转换为 int 时 int object 然后当对象值为 0 时 他会给我错误 指出特定的强制转换无效 当我将对象转换为 int 时 convert toint32 object 然后他工作并给我 0 意味着演员阵容有效 我想知道
  • 如何在 C++ 中逐行读取文件中的整数组

    我有一个文本文件 每一行都有一个或多个整数 用空格分隔 我怎样才能用 C 优雅地阅读这个内容 如果我不关心行 我可以使用 cin gt gt 但整数在哪一行很重要 输入示例 1213 153 15 155 84 866 89 48 12 1
  • WP REST API 自定义 POST 端点不工作,404 错误

    我正在编写一个插件 但我在使用自定义端点时遇到了一些问题 该端点从应用程序前端 Angular 接收数据 并将向其传递另一个函数来过滤一些数据 我对产品数据库的 GET 请求工作得很好 但 POST 只返回 404 错误 如果我在 Inso
  • 使用淡入淡出动画重绘 UIView?

    In TwUI 有一个方法叫做redraw on TUIView 它强制视图重绘 但它还带有视图的新旧状态之间的自由淡入淡出动画 我想知道在正常情况下是否可能发生类似的事情UIView 基本上 我如何重绘视图 setNeedsDisplay
  • STM32的HAL中实现单按、长按和双按功能

    我正在尝试实现单击 双击和长按功能来执行不同的功能 到目前为止 我已经理解了单击和长按的逻辑 但我不知道如何检测双击 至于代码 我使用计数器实现了单击和长按 但代码仅停留在第一个 if 条件上 bool single press false
  • 渲染画布时单词重叠

    我有一个很长的文本要渲染到画布上 并且单词在 Safari 中重叠且混乱 但在 Chrome 中完美运行 我正在使用最新版本的 html2canvas 库 v1 0 0 rc 3 这是 safari 中的输出 https i stack i
  • 错误消息:看起来您缺少一些运行 Electron 所需的依赖项

    全局安装 electro forge 后npm install g electron forge我在与 electro forge 相关的终端中输入的任何命令都会显示以下消息 它似乎缺少运行 Electron 所需的一些依赖项 确保您安装了
  • 根据国家地理 IP 将观众重定向到其他网站

    假设我有一个网站 www abc com featured abc 并且想将除马来西亚以外其他国家 地区的观众重定向 仅该链接 到 YouTube 视频 但 www abc com 仍然是全球性的 是的 我的服务器已经使用 geoip 模块
  • 使用httpwebrequest从网站获取图像到byte[]

    我想读取网站上 PNG 文件的原始二进制文件并将其存储到 byte 中 到目前为止我有这样的内容 Uri imageUri new Uri http www example com image png Create a HttpWebreq
  • 使用 java processbuilder 运行 bat 文件

    我正在尝试使用 java 进程生成器执行 bat 文件 但它不会启动该进程 请告诉我我在这里做错了什么 当我用 file sh 替换 file bat 时 这段代码在 Linux 环境下工作得很好 final ArrayList
  • Python 随机列表理解

    我有一个类似于以下内容的列表 1 2 1 4 5 2 3 2 4 5 3 1 4 2 我想从此列表中创建 x 个随机元素的列表 其中所选元素都不相同 困难的部分是我想通过使用列表理解来做到这一点 如果 x 3 可能的结果是 1 2 3 2
  • Rails 模型回调(创建/更新后)attribute_was 不起作用

    我正在将 Rails 5 1 应用程序迁移到 Rails 5 2 1 在我的模型中 我在创建或更新模型后使用回调来创建活动日志 很遗憾todo name and todo name was始终相同 当前值 这适用于每个属性和每个模型 还ch
  • 如何为 JMenu 子菜单设置加速器?

    我有一个用户请求将加速器添加到子菜单 JMenu 这将允许用户按下快捷键并使相应的子菜单 折叠 显示其包含的菜单项 我不记得每个人都见过这样的东西 无论是在 Java 还是任何其他语言中 我们的应用程序是使用 Swing 用 Ja va 编