0

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

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

特别是在 JScrollPane 类的祖先输入映射 ((InputMap)UIManager.get("ScrollPane.ancestorInputMap");) 我们添加

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

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

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

4

3 回答 3

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

在此处输入图像描述

在此处输入图像描述

在此处输入图像描述

在此处输入图像描述

在此处输入图像描述

在此处输入图像描述

  • DU也喜欢这个论坛,

  • SSCCE 可以为第二侧的志愿者打开任何门。不是吗

于 2012-09-19T21:37:20.823 回答
1

正如 mKorbel 正确显示的那样,有一个动作“向上翻页”和“向下翻页”(参见第 3 个屏幕)。所以只需使用 ActionMap 并将操作替换为您的操作。

于 2012-09-20T06:12:55.000 回答
1

好吧,垃圾神基本上是对的。解决方案是对操作使用 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);
        }
    }

在滚动窗格中

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");
    }

请注意,我们不必映射移动的 Up 和 Down 键,因为 JScrollPane 已经使用这些键完成了我们想要的操作。从 JTextPane 中取消映射它们就足够了。而其他四个击键是完全非标准的,也必须在滚动窗格中重新映射。

感谢你的帮助!

哦,实际的答案是 JTextPane 当然通常会处理这些箭头键。为了做我想做的事,我必须打败它并在滚动窗格中适当地映射,

于 2012-09-20T21:42:16.720 回答