我正在编写带有菜单,工具栏和表格的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做任何特别的事情。

最佳答案

更深层解决方案的概述:

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

当您要执行这些操作时,任务有两个:


实现并设置支持这些操作的自定义TransferHandler(请参见Swing dnd的教程章节)
将菜单动作包装在transferHandler的动作周围:包装器将提供类似f.i的视觉效果。文本,图标并委托实际操作执行到处理程序操作


下面是被接受的原件;-)

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

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

table.setTransferHandler(null);


更深层的解决方案将尝试挂接到transferHandler,请参见上文。

09-18 08:12