JTable捕获关键事件?

时间:2013-06-24 13:22:03

标签: java swing jtable keylistener keyevent

我正在编写一个包含菜单,工具栏和表格的swing应用程序。

我已将 CTRL + W 等各种关键笔划映射到特定操作。这些都可以正常工作,除了 CTRL + V CTRL + C CTRL + 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做任何特别的事。

2 个答案:

答案 0 :(得分:4)

更深层解决方案的概述:

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

由于您希望实施这些操作,任务有两方面:

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

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

表中捕获复制/粘贴/剪切绑定的部分(树,列表相同)是由他们的ui代表安装的TransferHandler。

我想到的一个快速解决方案是使处理程序无效:

table.setTransferHandler(null);

更深入的解决方案会尝试挂钩transferHandler,见上文。

答案 1 :(得分:3)

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