Java 当JTextPane嵌入到JScrollPane中时,哪个组件处理arrow-KeyEvents?

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类的祖先输

好的,我们再来一次。史蒂夫必须编写另一套非标准的按键。 我们在JScrollPane中嵌入了一个可编辑的JTextPane。这个窗格可以正确处理上下箭头键,但我不知道如何处理。如果我能想出办法,我就能实现我需要实现的非标准的东西

特别是,由于PageDown键全局映射到执行另一个函数,因此我们不执行PageUp、PageDown、Ctrl PageUp和Ctrl PageDown的默认操作。相反,我们希望将这些功能映射到移动的箭头键,而不是数字键盘上的键

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

  • 向下移动的箭头键指向指向的祖先输入映射 “向下滚动”操作
  • 向上移动的箭头键指向指向 “向上滚动”操作
  • 将左箭头键移到指向 “滚动主页”操作
  • 将向右箭头键移动到指向 “滚动结束”动作
这些按键都没有任何作用。我甚至重写了JComponent的processKeyEvent()和processKeyBinding()方法来记录发生的事情,我发现这些方法从来不会被这些击键触发。此外,普通的标准上箭头和下箭头击键不会触发这些方法,即使这些击键确实有效

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

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

  • 我也很喜欢这个论坛

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

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

      • 我也很喜欢这个论坛

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


      当mKorbel正确显示时,有一个动作“翻页向上”和“翻页向下”(参见第三屏)。因此,只需使用ActionMap并用您的操作替换该操作。

      因为mKorbel正确地显示了“翻页”和“翻页”操作(请参见第三个屏幕)。所以只要使用动作图,用你的动作替换动作。

      好的,垃圾神基本上是对的。解决方案是为操作使用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通常会处理这些箭头键。要想做我想做的事,我必须克服这一点,并在滚动窗格中适当地映射,

      好的,垃圾神基本上是对的。解决方案是为操作使用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键(在文本窗格中禁用它们之后),但这两个键都不起作用。但是