Java JTextComponent键映射

Java JTextComponent键映射,java,swing,keymapping,jtextcomponent,Java,Swing,Keymapping,Jtextcomponent,我需要创建一个从JTextComponent(实际上是从JTextPane)派生的类,其中至少有一个默认的键映射被更改。也就是说,在我的特殊JTextPane中,我希望“>”击键执行一个操作,而不是将该字符添加到文本窗格中,因为默认情况下会处理所有可打印的键入字符 要阻止正常行为,有以下API: JTextComponent.getKeymap() Keymap.addActionForkeyStrope() JTextComponent.setKeymap() 然而,我发现尽管这些方法不是

我需要创建一个从
JTextComponent
(实际上是从
JTextPane
)派生的类,其中至少有一个默认的键映射被更改。也就是说,在我的特殊JTextPane中,我希望“>”击键执行一个操作,而不是将该字符添加到文本窗格中,因为默认情况下会处理所有可打印的键入字符

要阻止正常行为,有以下API:

  • JTextComponent.getKeymap()
  • Keymap.addActionForkeyStrope()
  • JTextComponent.setKeymap()
然而,我发现尽管这些方法不是静态的,但它们确实会影响我的应用程序中所有
JTextComponent
s使用的键映射。没有一种简单的机制可以用来克隆一个密钥映射,这可能会解决问题,或者我遗漏了什么

我想要的是一种为我的
JTextPane
类而不是所有
JTextComponent
派生类更改键映射的方法


或者我应该去别处看看吗?

嗯,美国在台协会有点难以理解,但答案如下:

本文作者Tim Prinzing(我相信他也是源代码中JTextComponent的作者)提供了一个示例,我将对此进行评论:

      JTextField field = new JTextField();
// get the keymap which will be the static default "look and feel" keymap
      Keymap laf = field.getKeymap();
// create a new keymap whose parent is the look and feel keymap
      Keymap myMap = JTextComponent.addKeymap(null, laf);
// at this point, add keystrokes you want to map to myMap
      myMap.addActionForKeyStroke(getKeyStroke(VK_PERIOD, SHIFT_DOWN_MASK), myAction); 
// make this the keymap for this component only.  Will "include" the default keymap
      field.setKeymap(myMap);
我的错误是将我的击键添加到getKeymap返回的keymap中,而不是让它传递给孩子。我的意思是,addKeymap()这个名字令人困惑。它可能应该是createKeymap()。

我会选择一个特定的,尤其是如果您希望您的映射只对一个实例有效,而不是全局有效

以下是捕获密钥并执行适当操作的示例:

JFrame f = new JFrame();

StyledDocument d = new DefaultStyledDocument() {
   @Override
   public void insertString(int offs, String str, AttributeSet a) throws BadLocationException {
      if (">".equals(str)) {
         // Do some action
         System.out.println("Run action corresponding to '" + str + "'");
      } else {
         super.insertString(offs, str, a);
      }
   }
};

JTextPane t = new JTextPane(d);
f.add(t);

但是,但是,但是。。。我会认为,当按下我的键时,键处理(参见上面提到的文章中的图表)会发现我的击键并执行操作(这部分工作正常),它会消耗键事件。这不会发生!相反,它也会在屏幕上打印。通过登录密钥侦听器,我可以看到事件仍然处于活动状态。然而,我在我的动作中得到的只是一个动作事件,它不能被消费!链接已损坏,无法遵循。由于你没有写一个网页的名字或类似的东西,我不知道如何搜索它。你认为你能找到这个页面的新位置吗?或者记得这个页面是如何命名的吗?@Suma-这并不容易,但我在谷歌上找到了这个东西:“myMap Prinzing”。这让我想到了。文章的标题是“使用Swing文本包”。找不到它的任何其他副本。看起来甲骨文已经摆脱了它。这是一个很棒的问题,做得很好。虽然它不能直接回答这个问题,但可以看看其他人在类似情况下做了什么。aymeric在正确的轨道上我会使用个人使用文档过滤器,但我认为你在正确的轨道上。就我个人而言,我有点担心在过滤器上附加某种操作,但那只是我;)