0

JTextField に対応する 2 つの抽象ドキュメントがあるとします (両方の JTextField は異なる変数です)。

ユーザーが JtextField1 (ドキュメント A) に数値を入力すると、それに応じて実行時に他の JTextField2 (ドキュメント B) を更新する必要があります。ユーザーが同じプログラムの実行時に JTextField2 (ドキュメント B) に数値を入力した場合も同様であり、JTextField1 (ドキュメント A) を更新する必要があります。

Document Listener を使用してこれを解決しようとしましたが、デッドロックが発生するため、両方 (または正確には互い) ではなく、実行時に一方のドキュメントを更新する (A が B を更新するか、その逆) 場合にのみ機能します。この問題に DocumentFilter を使用する必要がありますか? ただし、この状況にどのように適用するかはわかりません。フィールドがフォーカスされていないときにFocusListenersを使用し、DocumentListenerを無効にすることで、デッドロック/書き込みロックの問題を回避しようとしましたが、スレッドをまったく処理しないため、非常に単純なアプローチでした(それが問題である場合)。他のフィールドが選択されたときに別のスレッドを作成すれば十分でしょうか?私はマルチスレッドについての本当の知識はありません。この問題について何らかのアドバイスをいただければ幸いです。

コード: http://pastebin.com/qqYPXcAf

ユーザー入力時に実行時にARを維持するために、幅/高さのサイズをピクセル単位で更新するPhotoshopの同様のGUI機能を再作成しようとしています(画像: http://puu.sh/9L07v/c745e85867.png )

4

1 に答える 1

2

この問題に DocumentFilter を使用する必要がありますか?

簡単な解決策は、ドキュメントを共有することです:

JTextField textField1 = new JTextField(...);
JTextField textField2 = new JTextField(...);
textField2.setDocument( textField1.getDocument() );

または、2 つの値が異なるようにコードで何らかの計算を行っている場合は、DocumentListener を削除してループを回避できます。したがって、textField2 のリスナーの基本的なコードは次のようになります。

textField1.getDocument().removeDocumentListener(...);
textField1.setText( ... );
textField1.addDocumentListener(...);

したがって、テキスト フィールド 1 のテキストを更新しても、textField2 には通知されません。

于 2014-06-25T19:05:09.710 に答える