java - Swing:将功能键 (F2) 设置为加速器

标签 java user-interface swing jframe accelerator

我有一个菜单项“重命名”,将 F2 设置为快捷键。事实上,当菜单显示时,“重命名”旁边会有一个小的“F2”指示。

遗憾的是,这不起作用。此加速器触发无响应。当我将加速器更改为 CTRL+F2 - 它起作用了。

看来我应该使用 InpoutMpa/ActionMap。这样做的问题是我希望它在应用程序的任何地方都能工作,所以我试图将它与顶级 JFrame 相关联。但是,JFrame 没有 getInputMap() 方法。

迷路了。

[添加]

     ks = KeyStroke.getKeyStroke(KeyEvent.VK_F2, 0);
     JMenuItem mi = new JMenuItem("Rename");
     mi.setAccelerator(ks);
     mi.addActionListener(action); 

最佳答案

发生这种情况的原因可能是 JTable 使用 F2 调用 StartEditing 操作(我在我的一个程序中看到了相同的行为并将其追溯到此)。

有几个解决方案。最彻底的是删除这个输入映射(我相信这段代码实际上删除了所有 JTables 的映射):

KeyStroke keyToRemove = KeyStroke.getKeyStroke(KeyEvent.VK_F2, 0);

InputMap imap = table.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
while (imap != null)
{
    imap.remove(keyToRemove);
    imap = imap.getParent();
}

或者,如果您仅将表格用于显示,并且不打算让用户对其进行编辑,则可以使其不可聚焦:

table.setFocusable(false);

在一个完全不同的主题上,我强烈建议为您的菜单项创建一个 AbstractAction 子类,而不是“从头开始”创建它们。除了为您提供非常简单的菜单设置代码外,您还可以对主菜单和弹出窗口/工具栏使用相同的操作实例,并同时启用/禁用它们。

关于java - Swing:将功能键 (F2) 设置为加速器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2019371/

相关文章:

java - 尝试打包 Blackberry 应用程序时出现无效类文件错误

java - Android AlertDialog 不显示适配器名称

java - JPanel 中新的不可见层

java - Spring:将数据库配置从 XML 文件迁移到注释

java - 转换为推荐的参数化查询方法

java - 如何创建具有 3 个 slider 和 2 个下拉列表的 JDialog?

java - java游戏的gui框架

java - 黑莓聊天实现

java - PaintComponent 花费很长时间,占用了 Swing 事件调度线程

java - 在 JScrollPane 中调整 JPanel 大小时保持相对鼠标位置