単純な質問で申し訳ありませんが、JTextArea でスペース バーが押されるたびにメソッドを呼び出すにはどうすればよいですか? キーリスナーをテキスト領域にアタッチしようとしましたが、それを機能させることができませんでした。ありがとう。
3 に答える
How to Use Key Bindingsに関する Swing チュートリアルを読んでください。
チュートリアルには例があり、フォーラムには他の例がたくさんあります。
実行したいカスタム アクションを作成するときは、TextAction を拡張します。
JTextArea jt=new JTextArea();
jt.addKeyListener(new KeyListener(){
public void keyPressed(KeyEvent ke){
if(ae.getKeyCode()==KeyEvent.VK_SPACE){
//call your method
}
}
});
@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 の方が簡単です。そして、それはあなたの要件に依存します-あなたの場合、コピーして貼り付けても気にしないと思います.