5

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

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

  • JTextComponent.getKeymap()
  • Keymap.addActionForKeyStroke()
  • JTextComponent.setKeymap()

但是,我发现尽管这些方法不是静态的,但它们确实会影响JTextComponent我的应用程序中所有 s 使用的键映射。没有可以克隆 Keymap 的简单机制,这可能会解决问题,或者我错过了什么。

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

还是我应该去别处寻找?

4

2 回答 2

6

恕我直言,这有点难以理解,但答案就在这里: Tim Prinzing 的 Using the Swing Text Package

这篇文章的作者 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 返回的键映射中,而不是让它给孩子。恕我直言,名称 addKeymap() 令人困惑。它可能应该是 createKeymap()。

于 2012-08-15T18:25:15.340 回答
4

我会选择一个特定的文档,特别是如果您希望您的映射仅对实例有效而不是全局有效。

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

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);
于 2012-08-15T20:35:44.040 回答