好的,我们再来一次。史蒂夫必须编写另一组非标准的击键。 我们在JScrollPane中嵌入了一个可编辑的JTextPane。此窗格正确处理向上和向下箭头键,但我无法弄清楚如何。如果我能弄清楚如何,我可以实现我需要实现的非标准的东西。
具体来说,因为PageDown键全局映射到另一个函数,所以我们不对PageUp,PageDown,Ctrl-PageUp和Ctrl-PageDown执行默认操作。相反,我们希望将这些功能映射到移位的箭头键,而不是数字键盘上的键。
具体在JScrollPane类的祖先输入映射((InputMap)UIManager.get(“ScrollPane.ancestorInputMap”);)中添加
这些击键都不做任何事情。我甚至覆盖了JComponent的processKeyEvent()和processKeyBinding()方法来记录发生了什么,我发现这些方法永远不会触发这些方法。此外,普通标准向上箭头和向下箭头键击不会触发这些方法,即使这些键击确实有效。
所以很明显其他东西正在处理这些击键。但那是什么组成部分? 是的,当我尝试这个时,文本窗格确实有焦点。
答案 0 :(得分:2)
DU也喜欢这个论坛,
SSCCE可以为第二方的志愿者打开任何门。不是吗
答案 1 :(得分:1)
正如mKorbel正确显示有“向上翻页”和“向下翻页”的操作(请参阅第3个屏幕)。因此,只需使用ActionMap并将操作替换为您的操作。
答案 2 :(得分:1)
好的,trashgod基本上是正确的。解决方案是使用KeyBindings名称进行操作。找到正确答案的延迟是由于一些错误的代码在其他地方撤消了映射。
更具体地说,我们禁用JTextPane中的默认击键,然后将它们添加到Scroll Pane的输入映射中,映射到它们的新操作。
在TextPane构造函数
中...
disableAction("caret-down"); // down arrow
disableAction("caret-up"); // up arrow
disableAction("selection-backward"); // shift-left-arrow
disableAction("selection-forward"); // shift-right-arrow
disableAction("selection-up"); //shift-up-arrow
disableAction("selection-down"); // shift-down-arrow
}
private void disableAction(String name) {
Action a = getActionMap().get(name);
if (a != null) {
a.setEnabled(false);
}
}
在ScrollPane中
import static javax.swing.KeyStroke.getKeyStroke;
import static java.awt.event.KeyEvent.*;
...
private void remapShiftedArrowKeys() {
InputMap map = (InputMap)UIManager.get("ScrollPane.ancestorInputMap");
map.put(getKeyStroke(VK_DOWN, SHIFT_DOWN_MASK), "scrollDown");
map.put(getKeyStroke(VK_UP, SHIFT_DOWN_MASK), "scrollUp");
map.put(getKeyStroke(VK_LEFT, SHIFT_DOWN_MASK), "scrollHome");
map.put(getKeyStroke(VK_RIGHT, SHIFT_DOWN_MASK), "scrollEnd");
}
请注意,我们不必映射已移位的向上和向下键,因为JScrollPane已经使用这些键执行了我们想要的操作。它足以从JTextPane中取消映射它们。而其他四个击键完全是非标准的,并且还必须在滚动窗格中重新映射。
感谢您的帮助!
哦,实际答案是JTextPane当然通常处理那些箭头键。要做我想做的事情,我必须打败它并在滚动窗格中适当地映射,