Java 当JTextPane嵌入到JScrollPane中时,哪个组件处理arrow-KeyEvents?
好的,我们再来一次。史蒂夫必须编写另一套非标准的按键。 我们在JScrollPane中嵌入了一个可编辑的JTextPane。这个窗格可以正确处理上下箭头键,但我不知道如何处理。如果我能想出办法,我就能实现我需要实现的非标准的东西 特别是,由于PageDown键全局映射到执行另一个函数,因此我们不执行PageUp、PageDown、Ctrl PageUp和Ctrl PageDown的默认操作。相反,我们希望将这些功能映射到移动的箭头键,而不是数字键盘上的键 特别是在JScrollPane类的祖先输入映射((InputMap)UIManager.get(“ScrollPane.ancestorInputMap”);)中,我们添加了Java 当JTextPane嵌入到JScrollPane中时,哪个组件处理arrow-KeyEvents?,java,swing,jscrollpane,key-bindings,Java,Swing,Jscrollpane,Key Bindings,好的,我们再来一次。史蒂夫必须编写另一套非标准的按键。 我们在JScrollPane中嵌入了一个可编辑的JTextPane。这个窗格可以正确处理上下箭头键,但我不知道如何处理。如果我能想出办法,我就能实现我需要实现的非标准的东西 特别是,由于PageDown键全局映射到执行另一个函数,因此我们不执行PageUp、PageDown、Ctrl PageUp和Ctrl PageDown的默认操作。相反,我们希望将这些功能映射到移动的箭头键,而不是数字键盘上的键 特别是在JScrollPane类的祖先输
- 向下移动的箭头键指向指向的祖先输入映射 “向下滚动”操作
- 向上移动的箭头键指向指向 “向上滚动”操作
- 将左箭头键移到指向 “滚动主页”操作
- 将向右箭头键移动到指向 “滚动结束”动作
- 史蒂夫的参考版本:-)
- 我也很喜欢这个论坛
- SSCCE可以在第二面为志愿者打开任何门。不是吗
- 史蒂夫的参考版本:-)
- 我也很喜欢这个论坛
- SSCCE可以在第二面为志愿者打开任何门。不是吗
...
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");
}
注意,我们不必映射上下移动的键,因为JScrollPane已经对这些键执行了我们想要的操作。从JTextPane中取消映射就足够了。然而,这四次击键是完全非标准的,也必须在滚动窗格中重新映射
谢谢你的帮助
哦,实际的答案是JTextPane通常会处理这些箭头键。要想做我想做的事,我必须克服这一点,并在滚动窗格中适当地映射,好的,垃圾神基本上是对的。解决方案是为操作使用KeyBindings名称。找到正确答案的延迟是由于一段游离的代码在别处破坏了映射 更具体地说,我们禁用JTextPane中的默认击键,然后将它们添加到滚动窗格的输入映射中,映射到它们的新操作 在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");
}
注意,我们不必映射上下移动的键,因为JScrollPane已经对这些键执行了我们想要的操作。从JTextPane中取消映射就足够了。然而,这四次击键是完全非标准的,也必须在滚动窗格中重新映射
谢谢你的帮助
哦,实际的答案是JTextPane通常会处理这些箭头键。要想做我想做的事情,我必须克服这一点,并在滚动窗格中适当地映射,尽快发布一条寻求更好帮助的信息。也许,但一般来说,在正常的Swing中,与我的糟糕版本相反,哪个组件处理箭头键?它是滚动条、滚动窗格还是文本窗格?另请参见,其中列出了每个L&F的默认设置。睡眠时间,关于具体L&F的关键点和差异的精彩评论&F@trashgod-是的,在这种情况下,钥匙绑定总是我的第一站,事实上我已经去过了。你认为我怎么知道输入映射和操作的名称?但在这种情况下,这并没有回答我的问题。请尽快发布一个更好的帮助。也许,但一般来说,在正常的Swing中,与我的糟糕版本相反,哪个组件处理箭头键?它是滚动条、滚动窗格还是文本窗格?另请参见,其中列出了每个L&F的默认设置。睡眠时间,关于具体L&F的关键点和差异的精彩评论&F@trashgod-是的,在这种情况下,钥匙绑定总是我的第一站,事实上我已经去过了。你认为我怎么知道输入映射和操作的名称?但在本例中,这并没有回答我的问题。然而,部分问题是,这些命名操作实际上做了什么?在滚动窗格页面中,我们将CTRL_page_向上映射为“scrollLeft”,将CTRL_page_DONN映射为“scrollRight”。这有点奇怪。这是指转到文档的顶部还是底部?还有“scrollHome”和“scrollEnd”操作。我已经尝试将这两个集映射到我的Shift Right和Shift Left键(在文本窗格中禁用它们之后),但这两个键都不起作用。但是