2012-03-13 9 views
5

スイングコンポーネントの値を他の変数と同じように設定しましたが、このページには、https://bitguru.wordpress.com/2007/03/21/will-the-real-swing-single-threading-rule-please-stand-up/がありました。イベントスキャッチスレッドを使用してスイングコンポーネントに変更を加えるようですスイングコンポーネントを正しく更新する

ので、これは正しいですが、私は私がこれまでこの

String name = this.getNameTextfield().getText(); 
    String password = new String(this.getPasswordField().getPassword()); 
    String confirmPassword = new String(this.getConfirmPasswordField().getPassword()); 

からSwingコンポーネントを更新し、すべてのコードを変更する必要がありますか?

これは標準的な方法ですか?

編集:私のコンポーネントに関連するコードのいくつかをコピーして貼り付けただけで、コンポーネントを更新していないということが見落とされました。

+0

私の答えは正しくないことに注意してください。正しいものはクレオパトラです。 – MByD

答えて

3

この特定のケースでは、コンポーネントを変更しないため、EDTで行う必要はありませんが、UIを変更する場合は2番目の方法が正しいです。

+2

私の答えを参照してください – kleopatra

1

コンポーネントからデータを読み取っているだけの場合は、おそらくこれを行う必要はありません。 Swingコンポーネントのプロパティからの読み込みは、スレッドセーフです。

イベントディスパッチスレッドでコードを実行する場合は、実際にGUIを更新したい場合には、invokeLaterを使用する必要があります。

short little tutorial here regarding the use of invokeLaterがあります。

あなたの人生をより簡単にし、問題のリスクを最小限に抑えるために、私はSwing GUIと対話するコードがすべてEDTで実行されるようにすることをお勧めします。 kleopatraが正しく指摘するように、良いニュースは、すべてのイベント処理コードがEDTによって呼び出されるため、これはほとんど自動的に発生するということです。

+2

私の答え – kleopatra

+0

@kleopatraを参照してください、多分あなたは理論では正しいですが、実際にはかなりスイングコンポーネントのプロパティからすべての読み取りは実際にスレッドセーフです。結局のところ、それらは一般的に単なるフィールドを読み取る単純なアクセサメソッドです。 – mikera

+0

ええ、それは私たちが得ることのできるスレッドセーフではありません。他のスレッド:-) – kleopatra

4

文字列は不変です - あなたは、構成要素を変形していない

String password = new String(this.getPasswordField().getPassword()); 
String password = this.getPasswordField().getPassword(); 

次の行はかなり同等です。

更新している場合は、その更新が別のスレッドからのものであった場合のみです。たとえば、ボタンにアタッチされたActionListenerからテキストフィールドを更新していた場合は、Event-Dispatch-Threadに既に入っているので不要になります。

EDTを最初に使用しているかどうかを最大限正確に判断する必要があります。

Runnable update = new Runnable() { 
    @Override 
    public void run() { 
     getNameTextfield().setText("foo"); 
    } 
}; 
if (SwingUtilities.isEventDispatchThread()) { 
    update.run(); 
} else { 
    SwingUtilities.invokeLater(update); 
} 
9

スイング聖書はchapter on concurrency、一番下の行があります。

作成またはすべてのコードは、イベントディスパッチスレッド上で実行する必要がありますSwingコンポーネントと相互作用を

(重点があります私の)

はい、あなたは常にあなたのすべてのアクセス、readi EDT上で発生します。

EDTでアプリケーションを正しく起動すると、すでにになっており、ほぼすべてのアクセスが自然にEDTで行われます。あなたが明示的に別のスレッド(長いバックグラウンドタスクを行うために)を開始し、uiに戻って報告する必要がある場合のみ、そうではありません:invokeLaterにアクセス呼び出しをラップする必要があります(または内部的に実行するSwingWorkerを使用)

+0

+1、私は知りませんでした、読書はEDTでもやってください:-) –

+0

あなたは正しいです。この回答は受け入れられるものでなければなりません。私はそれが受け入れられたので私のものはできません。しかし、とにかく+1。 – MByD

関連する問題