2010-08-22 12 views
16

Bu yöntemi kullanarak runnable parametresinin EventQueue sistemine gönderileceğini biliyorum. Ancak tüm GUI güncellemeleri bu yöntemi kullanarak yapılmalı mı? ben bu yaklaşım kullanmalıdırJava masaüstü uygulamasında herhangi bir GUI güncellemesi için EventQueue.invokeLater kullanmalı mıyız?

java.awt.EventQueue.invokeLater(new Runnable() { 
     public void run() { 
     jButton1.setText("changed text"); 
     } 
}); 

, herhangi desen bu tekrarlayan kod önlemek için kullanabilirsiniz: Ben, demek JButton bir metni değiştirmek istediğinizde, ben böyle bir şey kullanmalıyım ki?

+0

Not: Yavaş kod sallanmaya duyarlı kalmak için oraya gitmek zorundadır –

+4

@nash Aşağıdaki cevaplardan herhangi biri sorunuza cevap verirse, yanıt olarak işaretleyebilir misiniz? –

cevap

27

UI'nizi UI iş parçacığı (olay gönderme iş parçacığı) olmayan başka bir iş parçacığından güncellemek istediğinizde yalnızca invokeLater kullanmanız gerekir.

Düğme tıklatması için bir işleyiciniz olduğunu ve bir kullanıcı düğmeyi tıkladığında etiketin metnini değiştirmek istediğinizi varsayalım. Ardından, etiket metnini doğrudan ayarlamak mükemmel bir şekilde kaydedilir. Bu, düğme tıklama olayına ilişkin işleyici UI iş parçacığında çalıştırıldığı için mümkündür.

Bununla birlikte, başka bir düğmeyi tıkladığınızda, bazı çalışmaların yapıldığı ve bu iş bittikten sonra UI'yi güncellemek istediğiniz numaralı başka bir iş parçacığı başlatırsınız. Sonra invokeLater kullanın. Bu yöntem, UI güncellemenizin UI iş parçacığı üzerinde yürütülmesini sağlar.

Pek çok durumda, invokeLater'a ihtiyacınız yoktur, doğrudan UI güncellemelerini doğrudan yapabilirsiniz. Emin değilseniz, geçerli kodunuzun etkinlik gönderme iş parçacığı içinde çalışıp çalışmadığını kontrol etmek için isDispatchThread'u kullanabilirsiniz.

+0

Tamam, emin değilsek, geçerli iş parçacığı olay gönderme iş parçacığı olup olmadığını denetlemek için EventQueue.isDispatchThread() yöntemini kullanabiliriz. sağ? – nash

+1

Bu doğru. Bu yöntemle ilgili bazı bilgileri yanıtıma ekledim. –

+0

Ama hala kısayol yok mu? Yukarıdaki boilerplate için bir kısayol veya makroyu beğendim (eğer isDispatchThread X ise, aksi halde X'i sarın ve gönderin.). Delphi'den gelmek istiyorum. “Sync (x (a, b, c))” sözcüğünü çağırmak istiyorum ama java sözdizimi ile java sözdizimi olduğunu düşünüyorum, “public void {}” şeyler kaçınılmaz. Java yazmaktan tasarlandıkları şekilde yazmaktan kaçınmak için kendimi C-stili makrolar için dilediğimi bulmam çok komik. –

2

Yalnızca olay dağıtım dizisinde değilseniz, bunu yapmanız gerekir. Yeni iş parçacığı başlatmamış veya ana iş parçacığı tarafından kod çalıştırılmadıkça, tüm kodunuz muhtemelen bu durumu gereksiz hale getiren olay gönderme iş parçacığından başlamaktadır. Örneğin, tüm UI olay işleyicileri olay dağıtım iş parçacığı üzerinde çağrılır, böylece oradan denilen kod için bunu yapmanız gerekmez.

1

Gerçekten “tekrarlayan” dan kaçınmak yerine (java'lılar büyük ihtimalle pek çok sır içermeyen okunabilir kodlar) Eclipse'in şablon özelliğini kullanabilirdiniz. ben şu bloğuna iki harf "il" genişletmek için belirledik:

EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       try { 
        // do something. 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 

Görünüşe göre bu gönderme sırası tasarımı sadece tavsiye edilmez, bu temelde gerekli oluyor. Bu, bir lambdayı bir mesaj kuyruğuna doğru itmenin herhangi bir dilinde gördüğüm en gürültülü yoldur. Ama işte burada. Bu java. Ve Java'nın savunmasında, tam olarak yukarıda olanlardan açıkça belli oluyor. Yazma miktarına kızmaya başladım, ancak bunu düşünebildiğim tek şey C önişlemcisi Makro'dur ve ben Java kullanıcılarını kullanmayı sevmiyorum. Şablonlar aracılığıyla kod genişletme daha okunabilir, desteklenebilir ve herhangi bir kara büyü içermez.

+0

P hayır, hayır, asla kullanmayın - catch - GUI oluşturmak için nihayet, invokeLater :-) için – mKorbel

+1

@mKorbel nedenini açıklayabilir misiniz? – varuog

+1

Kontrol edilmiş istisnalar için seçeneğiniz yok. –

İlgili konular