Java:如何使用加速器创建粘贴菜单项?

Java:如何使用加速器创建粘贴菜单项?,java,swing,menu,accelerator,Java,Swing,Menu,Accelerator,当我创建一个包含粘贴操作的JMenuBar并为其分配一个加速器(Control-V)时,我为JMenuBar项编写粘贴操作。我使用加速器,我的代码将被执行,Swing预编程的粘贴操作将被执行,所以我认为文本将被粘贴两次 我没有测试它,但是,这看起来很符合逻辑,这就是问题所在 谢谢Swing使用键绑定工作。因此,根据找到的键绑定,只调用一个操作。所以你不会让文本粘贴两次 您可能会调用不同的操作,具体取决于哪个组件具有焦点以及如何调用该操作 例如,如果焦点在文本组件上,那么我猜将使用默认的粘贴操作

当我创建一个包含粘贴操作的JMenuBar并为其分配一个加速器(Control-V)时,我为JMenuBar项编写粘贴操作。我使用加速器,我的代码将被执行,Swing预编程的粘贴操作将被执行,所以我认为文本将被粘贴两次

我没有测试它,但是,这看起来很符合逻辑,这就是问题所在


谢谢

Swing使用键绑定工作。因此,根据找到的键绑定,只调用一个操作。所以你不会让文本粘贴两次

您可能会调用不同的操作,具体取决于哪个组件具有焦点以及如何调用该操作

例如,如果焦点在文本组件上,那么我猜将使用默认的粘贴操作

如果单击菜单项,则将调用添加到菜单项的操作

如果在焦点不在文本字段上时调用Control+V,那么我猜绑定到菜单项的操作将被调用,因为加速器使用“焦点窗口”(或其任何名称)InputMap

如果您使用的是EditorKit提供的默认操作,则不会出现问题:

JMenuItem pasteAction = new JMenuItem( new DefaultEditorKit.PasteAction() );
pastAction.setAccelerator(...);

也许您需要从组件操作映射中删除粘贴操作?