【问题标题】:JTable capturing key events?JTable 捕获关键事件?
【发布时间】:2013-06-21 00:34:24
【问题描述】:

我正在编写一个带有菜单、工具栏和表格的摇摆应用程序。

我已将 CTRL + W 等各种击键映射到特定操作。这些都可以正常工作,除了 CTRL + VCTRL + CCTRL kbd> + X。 我希望能够剪切或复制行,然后将它们粘贴到表格中。

当我单击按钮时,功能本身可以正常工作,但使用键盘快捷键不会触发这 3 个特定事件。 JTable 是否有可能默认捕获它们?如果是这样,我该如何禁用此行为?

动作声明:

ExampleAction editCopy = new ExampleAction();
editCopy.putValue(Action.NAME, "Copy");
editCopy.putValue(Action.SMALL_ICON, ClientUtil.getImageResource("copy.gif"));
editCopy.putValue(Action.SHORT_DESCRIPTION, "Copy the selected row(s)");
editCopy.putValue(Action.MNEMONIC_KEY, new Integer('C'));
editCopy.putValue(Action.ACCELERATOR_KEY,
                    KeyStroke.getKeyStroke(KeyEvent.VK_C, Event.CTRL_MASK));

将动作添加到菜单和工具栏:

JMenu menu = new JMenu();
JMenuItem menuItem = new JMenuItem(editCopy);
KeyStroke accKey = (KeyStroke) editCopy.getValue(Action.ACCELERATOR_KEY);
menuItem.setAccelerator(accKey);
menu.add(menuItem);

JToolBar toolbar = new JToolBar();
JButton button = new JButton(editCopy);
toolbar.setText("");
toolbar.add(button);

我没有对 JTable 做任何特别的事情。

【问题讨论】:

  • 你能放一些代码吗?

标签: java swing jtable keylistener keyevent


【解决方案1】:

更深层解决方案的概述:

这些键是默认的粘贴/复制/剪切笔划,它们已经在表格的 action/inputMap 中绑定到 TableTransferHandler 提供的操作,其中...粘贴/复制/剪切 :-)。

当您想要实施这些操作时,任务有两个:

  • 实现并设置支持这些操作的自定义 TransferHandler(请参阅关于 Swing dnd 的教程章节)
  • 将您的菜单操作包装在 transferHandler 的操作周围:包装器将提供像 f.i. 这样的视觉效果。文本、图标并将实际的 actionPerformed 委托给处理程序操作

以下是原件,已被接受;-)

捕获复制/粘贴/剪切绑定的表格部分(树、列表相同)是由其 ui-delegate 安装的 TransferHandler。

我想到的一个快速解决方案是将处理程序设为空:

table.setTransferHandler(null);

更深层次的解决方案是尝试挂钩到 transferHandler,见上文。

【讨论】:

  • 谢谢,完美地完成了这项工作!
  • @lugte098 hach​​ ...在您接受原始答案时进行了编辑-实际上我认为从长远来看,您应该走更清洁的道路。
  • 感谢您的校准,但由于应用程序不会变得比现在更复杂,这是一个快速而肮脏的解决方案,完美地完成了这项工作。在编辑单元格的内容时,复制/剪切/粘贴键击仍然可以正常工作,所以我对此非常满意。
【解决方案2】:

我会使用Key Bindings 作为组合键。

【讨论】:

  • 感谢您的回复,但 kleopatra 的回答对我来说是一个更快的解决方案,并且完成了工作。
猜你喜欢
  • 1970-01-01
  • 2020-08-31
  • 2015-10-16
  • 1970-01-01
  • 1970-01-01
  • 2016-07-31
  • 2020-03-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多