4

単純な質問で申し訳ありませんが、JTextArea でスペース バーが押されるたびにメソッドを呼び出すにはどうすればよいですか? キーリスナーをテキスト領域にアタッチしようとしましたが、それを機能させることができませんでした。ありがとう。

4

3 に答える 3

6

How to Use Key Bindingsに関する Swing チュートリアルを読んでください。

チュートリアルには例があり、フォーラムには他の例がたくさんあります。

実行したいカスタム アクションを作成するときは、TextAction を拡張します。

于 2013-03-26T03:05:40.383 に答える
4
JTextArea jt=new JTextArea();

jt.addKeyListener(new KeyListener(){ 

    public void keyPressed(KeyEvent ke){ 

         if(ae.getKeyCode()==KeyEvent.VK_SPACE){
              //call your method
         }
    }
});
于 2013-03-26T06:31:27.963 に答える
0

@camickr には、私が賛成した優れたシンプルなソリューションがありますが、複雑ではあるがより徹底的なオプションは、 にDocument関連付けられた を操作し、そのメソッドJTextAreaをオーバーライドすることinsertString()です。たとえば、文字が数値フィールドに追加されないようにするために、すでにこれを行っている場合があります。KeyBinding よりも優れている点は、ユーザーがコピーして JTextAreaに貼り付けたときにもキャッチされることです。したがって、ユーザーが「foo bar」をコピーして領域に貼り付けた場合、KeyBinding はそれをキャッチできず (私はかなり確信しています。ここで間違っているのでしょうか?)、Document テクニックはそれをキャッチします。たとえば、非常に概略的に:

@Override
public void insertString(int offset, String str, AttributeSet a) throws BadLocationException {
  if (str.contains(" "))
    callMySpecialSpaceMethod();
  super.insertString(offset, str, a);
}

@camickr が指摘したように、Document.insertString() を直接サブクラス化してオーバーライドする代わりに、代わりに DocumentFilter を設定できます。( Inheritance よりも Composition を優先します。) 残念ながら、一部のキャストでは少し扱いに​​くいですが、基本的なコードは次のとおりです。

((AbstractDocument)myTextArea.getDocument()).setDocumentFilter(new DocumentFilter() {

    @Override
    public void insertString(FilterBypass fb, int offset, String str, AttributeSet a) throws BadLocationException {
        if (str.contains(" "))
            callMySpecialSpaceMethod();
        fb.insertString(offset, str, a);
    }

});

これは KeyBinding よりもはるかに多くの作業であるため、本当にこれを徹底する必要がある場合や、別の理由で既にこれを行っている場合を除き、KeyBinding の方が簡単です。そして、それはあなたの要件に依存します-あなたの場合、コピーして貼り付けても気にしないと思います.

于 2013-03-26T15:11:29.387 に答える