5

デフォルトのキー マッピングの少なくとも 1 つが変更されているJTextComponent(実際にはから) から派生したクラスを作成する必要があります。つまり、私の特別な JTextPane では、">" キーストロークでアクションを実行し、その文字をテキスト ペインに追加しないようにします。デフォルトでは、すべての印刷可能な文字が処理されます。JTextPane

通常の動作を無効にするために、次の API があります。

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

ただし、これらのメソッドは静的ではありませんがJTextComponent、アプリケーション内のすべての で使用されるキーマップに影響を与えることがわかりました。おそらく問題を解決するか、何か不足しているキーマップを複製する簡単なメカニズムはありません。

私が求めているのは、JTextPaneクラスのキーマップを変更する方法ですが、すべてのJTextComponent派生クラスでは変更できません。

または、他の場所を探す必要がありますか?

4

2 に答える 2

6

私見ですが、理解するのは少し難しいですが、答えはここにあります: Using the Swing Text Package by Tim Prinzing

この記事の著者である 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 によって返されたキーマップに追加したことです。IMHO、名前 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 に答える