2

我有一个扩展 JTextField 的类,我想让 CTRL-Shift-O 做一些事情。我一直在听

JTextFieldExtension.addKeyListener(new KeyAdapter() {

public void keyReleased(KeyEvent e)
{
}

}

在 e.isControlDown() 和 e.isShiftDown() 的帮助下,效果很好。但我注意到该字段中的文本也从左侧移动到右侧。显然这是 JTextField 的默认行为。所以我在 SO 上发现了这个似乎很有帮助的线程:

如何禁用 JTextField 中的默认文本字段快捷方式

从那个线程,调用jtextField.getInputMap().setParent(null); 确实停用了该行为。但它也摆脱了 Ctrl-C 和其他我仍想保留的有用映射。所以我尝试了建议的方法来删除 KeyStroke“ctrl shift O”。但它们似乎都不起作用。

目前在类的构造函数中,我有以下内容:

     this.getInputMap().put(KeyStroke.getKeyStroke("shift ctrl pressed O"), null);
     KeyStroke[] strokes = this.getInputMap().allKeys();
     for (KeyStroke ks : strokes)
     {
        System.out.println(ks.toString());
     } 

尽管 System.out.Println 显示“shift ctrl press O”作为它列出的 allKeys 之一,但它不起作用。我也尝试调用 InputMap.remove 而不是 Put(),但没有成功。

我错过了什么?

4

2 回答 2

4

在这种情况下,从输入映射中删除键似乎没有像我预期的那样工作,但是您可以覆盖已安装的操作以有效地禁用“切换组件方向”。在 Swing 中,输入映射将击键映射到对象(通常是字符串),这些对象用作动作映射的标识符,动作映射再次保存相应的动作。因此,禁用 ctrl+shift+O 的简单方法如下:

myComponent.getInputMap().put(KeyStroke.getKeyStroke("shift ctrl pressed O"), "Nothing");

这只是将击键重新映射到操作映射中未包含的内容(字符串“Nothing”,也可能是“Foo”),因此当您按下 ctrl+shift+O 时不会发生任何事情。

编辑:我可以看到这是在您链接的线程中提出的。但是,我确实确认上述代码适用于文本字段。如果它不适合您,请在您的代码中提供一个简短的调用示例。

于 2012-08-11T00:01:44.713 回答
0

所有默认绑定都列在InputMap您的组件中。我只是想指出另一种方法,考虑到人们正在努力实现的目标,这可能会更好:

        myTextComponent.getActionMap().put("toggle-componentOrientation", myAction});
于 2014-08-28T19:48:43.463 回答