我需要创建一个派生自JTextComponent
(实际上来自JTextPane
)的类,其中至少有一个默认键映射已更改。也就是说,在我特殊的JTextPane中,我想要“>”按键执行操作而不是将该字符添加到文本窗格,因为默认情况下会处理所有可打印的类型字符。
为了打破正常行为,有以下API:
JTextComponent.getKeymap()
Keymap.addActionForKeyStroke()
JTextComponent.setKeymap()
但是,我发现虽然这些方法不是静态的,但它们会影响我的应用程序中所有JTextComponent
使用的键映射。没有简单的机制可以克隆Keymap,可能会解决问题,或者我错过了什么。
我所追求的是一种更改我的JTextPane
类的键映射而不是所有JTextComponent
派生类的键映射的方法。
或者我应该在别处寻找?
答案 0 :(得分:5)
文章的作者Tim Prinzing,我相信,根据源代码,他也是JTextComponent的作者,提供了一个我将评论的例子:
JTextField field = new JTextField();
// get the keymap which will be the static default "look and feel" keymap
Keymap laf = field.getKeymap();
// create a new keymap whose parent is the look and feel keymap
Keymap myMap = JTextComponent.addKeymap(null, laf);
// at this point, add keystrokes you want to map to myMap
myMap.addActionForKeyStroke(getKeyStroke(VK_PERIOD, SHIFT_DOWN_MASK), myAction);
// make this the keymap for this component only. Will "include" the default keymap
field.setKeymap(myMap);
我的错误是将我的按键添加到getKeymap返回的keymap,而不是让它给孩子。恕我直言,名称addKeymap()令人困惑。它可能应该是createKeymap()。
答案 1 :(得分:4)
我会选择特定的Document,尤其是如果您希望映射仅对实例有效而不是全局有效。
以下是捕获密钥并执行适当操作的示例:
JFrame f = new JFrame();
StyledDocument d = new DefaultStyledDocument() {
@Override
public void insertString(int offs, String str, AttributeSet a) throws BadLocationException {
if (">".equals(str)) {
// Do some action
System.out.println("Run action corresponding to '" + str + "'");
} else {
super.insertString(offs, str, a);
}
}
};
JTextPane t = new JTextPane(d);
f.add(t);