当JTextPane嵌入JScrollPane时,哪个组件处理箭头KeyEvents?

时间:2012-09-19 21:11:27

标签: java swing jscrollpane key-bindings

好的,我们再来一次。史蒂夫必须编写另一组非标准的击键。 我们在JScrollPane中嵌入了一个可编辑的JTextPane。此窗格正确处理向上和向下箭头键,但我无法弄清楚如何。如果我能弄清楚如何,我可以实现我需要实现的非标准的东西。

具体来说,因为PageDown键全局映射到另一个函数,所以我们不对PageUp,PageDown,Ctrl-PageUp和Ctrl-PageDown执行默认操作。相反,我们希望将这些功能映射到移位的箭头键,而不是数字键盘上的键。

具体在JScrollPane类的祖先输入映射((InputMap)UIManager.get(“ScrollPane.ancestorInputMap”);)中添加

  • 向下箭头键移动指向的祖先输入地图 “scrollDown”动作
  • 向上移动箭头键指向指向的祖先输入地图 “scrollUp”动作
  • 将左箭头键移动到Ancestor输入地图指向 “scrollHome”动作
  • 将右箭头键移动到Ancestor输入映射指向 “scrollEnd”动作

这些击键都不做任何事情。我甚至覆盖了JComponent的processKeyEvent()和processKeyBinding()方法来记录发生了什么,我发现这些方法永远不会触发这些方法。此外,普通标准向上箭头和向下箭头键击不会触发这些方法,即使这些键击确实有效。

所以很明显其他东西正在处理这些击键。但那是什么组成部分? 是的,当我尝试这个时,文本窗格确实有焦点。

3 个答案:

答案 0 :(得分:2)

  • 史蒂夫的参考版本: - )

enter image description here

enter image description here

enter image description here

enter image description here

enter image description here

enter image description here

  • 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当然通常处理那些箭头键。要做我想做的事情,我必须打败它并在滚动窗格中适当地映射,