9

アプリケーションにtextFieldがあり、ユーザーがJListの項目をクリックすると、プログラムで開始されます(textField.setText())。後でユーザーがこの値を手動で変更します。このテキストフィールドの変更を検出するためにdocument-listenerを使用することに行き詰まります。プログラムで変更が発生した場合は何もしませんが、手動で変更した場合は背景を赤に変更する必要があります。

textFieldが手動で入力されたかtextField.setText()によって入力されたかを検出するにはどうすればよいですか?

txtMode.getDocument().addDocumentListener(new DocumentListener() {
        public void insertUpdate(DocumentEvent e) {
            if (!mode.equals(e.getDocument()))
            txtMode.setBackground(Color.red);
        }

        public void removeUpdate(DocumentEvent e) {
            if (mode.equals(e.getDocument()))
            txtMode.setBackground(Color.white);              
        }

        public void changedUpdate(DocumentEvent e) {
            //To change body of implemented methods
        }
    });
4

2 に答える 2

8

2つの方法があります

  • 完了したら、追加するDocumentListener前に削除しますsetText("...")DocumentListener

コード

public void attachDocumentListener(JComponent compo){
      compo.addDocumentListener(someDocumentListener);
}

//similair void for remove....
  • 「必要に応じて」無効にするために値を使用booleanしますが、DocumentListener

例えば

 txtMode.getDocument().addDocumentListener(new DocumentListener() {
    public void insertUpdate(DocumentEvent e) {
        if (!mode.equals(e.getDocument()))

        if (!updateFromModel){
           txtMode.setBackground(Color.red);
        }  
    }

    public void removeUpdate(DocumentEvent e) {
        if (mode.equals(e.getDocument()))

        if (!updateFromModel){
           txtMode.setBackground(Color.white);
        }  
    }

    public void changedUpdate(DocumentEvent e) {
        //To change body of implemented methods
    }
});
于 2012-06-20T13:02:04.943 に答える
4

すべてのイベントリスナーはSwingイベントスレッドで実行されることに注意してください。そのため、物事はあなたが望むように正確な順序で進まないかもしれません。この状況では、スイングスレッドとそのスレッドにイベントを投稿するユーザーを完全に制御できないため、どのソリューションもハックっぽくなります。

私が言おうとしているのは、これです。プログラムによる変更であることをリスナーに知らせるために、フラグを使用することを選択したとします。考えられるシナリオは次のとおりです(スイングスレッドからを介してUIの更新を行うという優れたルールに従っていると思いますinvokeLater)。

  1. イベントをスキップするようにフラグを設定します
  2. setText
  3. フラグをfalseに設定します

1回の呼び出しですべてを実行すると、setTextはイベントキューの最後に投稿された更新イベントをトリガーします。したがって、それらが実行されるまでに、フラグはすでにfalseになっています。

invokeLaterしたがって、1回の呼び出しでステップ1と2を実行するか、またはで実行してから、フラグを設定解除するためにinvokeAndWait別のイベントを投稿する必要があります。invokeLaterそして、ユーザーがこれら2つの呼び出しの間にいくつかの変更を加えるほど速くないことを祈ってください。そうしないと、プログラムによる変更と見なされます。

于 2012-06-20T13:30:31.727 に答える