我正在编写带有菜单,工具栏和表格的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,请参见上文。