19

入力または選択によってテキストが変更されるたびに何らかのアクションを実行したい編集可能な JComboBox がありますこの場合、テキストはパターンであり、パターンが有効であることを確認し、テスト データに一致するものを表示したいと考えています。

明らかなことを行って、ActionHandler をアタッチすると、入力に関しては、せいぜい (選択は問題ありません)、イベントが信頼できないように発生するように見えることがわかりました。そして、入力の結果として発火した場合 (getSelectedItem() はリストから選択されたときにのみテキストを取得するため、getEditor().getItem() を使用して) 取得されたテキストは、最後のイベントが発生しました - つまり、アクション イベントが発生する直前に入力された文字が常に欠落しています。

少しの遅延 (500 ミリ秒から 1 秒) の後にアクション イベントが発生することを期待していましたが、キーを押すとすぐに発生するようです (発生した場合)。

私が考えることができる唯一の実行可能な代替手段は、フォーカスが得られたときに1秒のタイマーを開始し、フォーカスが失われたときにそれを終了し、コンテンツが前回と異なる場合はタイマーアクションとして作業を行うことです.

何か考えや提案はありますか?

コード スニペットは特に興味深いものではありません。

find.addActionListener(this);
...
public void actionPerformed(ActionEvent evt) {
    System.out.println("Find: "+find.getEditor().getItem());
    }
4

3 に答える 3

31

通常、アクション リスナーは、Enter キーを押すか、コンボボックスのエディターからフォーカスを移動したときにのみ起動されます。エディターへの個々の変更をインターセプトする正しい方法は、ドキュメント リスナーを登録することです。

final JTextComponent tc = (JTextComponent) combo.getEditor().getEditorComponent();
tc.getDocument().addDocumentListener(this);

DocumentListener インターフェースには、エディターをサポートする Document が変更されるたびに呼び出されるメソッド( insertUpdate、removeUpdate、changeUpdate) があります。

イベントの送信元をより細かく制御するために、匿名クラスを使用することもできます。

final JTextComponent tcA = (JTextComponent) comboA.getEditor().getEditorComponent();
tcA.getDocument().addDocumentListener(new DocumentListener() { 
  ... code that uses comboA ...
});

final JTextComponent tcB = (JTextComponent) comboB.getEditor().getEditorComponent();
tcB.getDocument().addDocumentListener(new DocumentListener() { 
  ... code that uses comboB ...
});
于 2009-08-10T02:09:45.413 に答える
-1

次のようなものを使用できます。

JComboBox cbListText = new JComboBox();
cbListText.addItem("1");
cbListText.addItem("2");
cbListText.setEditable(true);
final JTextField tfListText = (JTextField) cbListText.getEditor().getEditorComponent();
tfListText.addCaretListener(new CaretListener() {
    private String lastText;

    @Override
    public void caretUpdate(CaretEvent e) {
        String text = tfListText.getText();
        if (!text.equals(lastText)) {
            lastText = text;
            // HERE YOU CAN WRITE YOUR CODE
        }
    }
});
于 2012-12-06T12:57:52.603 に答える