2012-03-13 14 views
5

Diğer bileşenlerde olduğu gibi salınım bileşenlerinde değerler ayarlıyorum, ancak bu sayfaya rastladım - https://bitguru.wordpress.com/2007/03/21/will-the-real-swing-single-threading-rule-please-stand-up/ - ve tüm değişiklikleri bir olay gönderme iş parçacığı kullanarak bileşenlerin salınımına dönüştürdüğüm anlaşılıyor.Salıncak bileşenlerini doğru bir şekilde güncelleme

Yani, bu bunu ne kadar bu

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

gelen salıncak bileşenleri güncellenen tüm kodunu değiştirmek gerekir, doğru mu?

java.awt.EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       String name = this.getNameTextfield().getText(); 
       String password = new String(this.getPasswordField().getPassword()); 
       String confirmPassword = new String(this.getConfirmPasswordField().getPassword()); 
      } 
     }); 

Bu standart uygulama mı?

Düzenleme: Yalnızca bileşenle ilgili kodumdan bazılarını kopyalayıp yapıştırdığım için, oops bileşeni güncellemediği gerçeğini gözden kaçırdı.

+0

cevabımın doğru olmadığını lütfen unutmayın. Doğru olan kleopatra. – MByD

cevap

3

Bu özel durumda, herhangi bir bileşeni değiştirmezsiniz, dolayısıyla bunu EDT'de yapmanız gerekmez, ancak UI'yi değiştirdiğinizde ikinci yöntem doğrudur.

+2

doğru değil, IMO, cevabımı gör – kleopatra

1

Sadece bileşenlerden veri okuyorsanız, muhtemelen bunu yapmanız gerekmez. Swing bileşen özelliklerinden en çok okunanlar thread güvenlidir. Genelde GUI'yi güncellemek istediğinizde geçerli olan Olay Harmanlama İpliği üzerinde kod çalıştırmak istiyorsanız,

invokeLater kullanılmalıdır. Bir short little tutorial here regarding the use of invokeLater var.

Hayatınızı kolaylaştırmak ve sorun riskini en aza indirmek için, Swing GUI ile etkileşime giren kodların EDT'de çalıştığından emin olmanızı öneririz. Kleopatra'nın doğru bir şekilde işaret ettiği gibi, iyi haber şu ki, tüm olay işleme kodunuz EDT tarafından çağrılacağından bu otomatik olarak gerçekleşir.

+2

doğru değil, IMO, cevabıma bakın – kleopatra

+0

Kleopatra, belki de teoride haklısın, ancak pratikte Swing bileşenlerinden gelen hemen hemen tüm okumalar aslında iş parçacığı için güvenlidir. Her şeyden önce, onlar sadece bir tek alan okuma sadece basit accessor yöntemleri vardır .... – mikera

+0

evet, çoğu zaman-hayır-ile-thread-unsafe-güvenli olmayan-okur-on-almak-onlardan biri çünkü diğer konular :-) – kleopatra

4

Karakter dizileri değişmez - Bileşenleri değiştirerek değil

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

aşağıdaki satırları hemen hemen eşdeğerdir.

Onları güncelleştiriyorsanız, yalnızca güncelleştirme başka bir Konudan geliyorsa. Örneğin, bir düğmeye bağlı bir ActionListener'den bir metin alanı güncellediyseniz, o zaman zaten Event-Dispatch-Thread üzerinde olduğunuz için gereksiz olurdu.

Maksimum doğruluk için öncelikle EDT'de olup olmadığınızı belirlemelisiniz.

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

Salıncak incil bir chapter on concurrency, alt hattı vardır:

oluşturan veya tüm kod olay gönderme iş parçacığı üzerinde çalışması gerekir Salıncak bileşenleriyle etkileşime

(vurgu benimki)

Evet, her zaman tüm erişiminizi sağlamak zorundasınız. Yazma veya yazma, EDT'de gerçekleşir.

Parlak tarafta: uygulama EDT'de doğru şekilde başlatıldığında, zaten üzerinde vardır ve neredeyse tüm erişimler EDT'de doğal olarak gerçekleşir. Açıkça başka bir iş parçacığı (uzun bir arka plan görevi yapmak için fi) başlattıysanız ve ui'ye rapor vermeniz gerekiyorsa bu geçerli değildir: o zaman erişim çağrılarını invokeLater içine sarmanız gerekir (veya dahili olarak bir SwingWorker kullanın)

+0

+1, bilmiyordum, bu okuma da EDT üzerinde yapılmalıdır :-) –

+0

Haklısınız. Bu cevap kabul edilen kişi olmalı. Kabul edildiğim için kendimi alamıyorum. ama yine de +1. – MByD

İlgili konular