2016-03-29 25 views
1

Düğmeye bağlı bir dinleyicim olduğunu varsayalım. Bu düğmeye bastığımda, actionPerformed çağrılır ve görünür olarak etiket etiketini ayarladım. Daha sonra calculate() yöntemi çalışır (içinde gerçekten uzun hesaplamalar vardır ve zaman alır). Sonra sonuçları show() yöntemiyle yazdırmak istiyorum.ActionScript’li javada kod çalıştırırken birden fazla görev gerçekleştirin

Şey i etiket yürütülecektir actionPerformed içindeki tüm kodundan sonra görünür olarak ayarlanacaktır bir gerçeği olduğunu bilirler.

Bu yüzden sorum şu: Arka planda çalışmak için calculate yöntemini nasıl ayarlamalıyım? İş Parçacığı? SwingTimer? SwingWorker? Henüz ideal bir yol bulamadım.

class ButtonListener implements ActionListener{ 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     calculateLbl.setVisible(true); 
     calculate();   
     show(); 
    } 
} 

cevap

3

Senin sorunun Salıncak eşzamanlılık biridir: hesapla() Salıncak olay parçacığı üzerinde çağrıldığında, uzun süren kod JLabel için boyama engelleyen, olay iplik engellemektedir. Çözüm, bir arka plan iş parçacığı hesaplamak ve daha sonra bittiğinde haberdar olmaktır. Bildirim oluştuğunda, show()'u arayın. Bir SwingWorker, kendi bildirim mekanizması ile birlikte geldiğinden bunun için harika çalışırdı.

örneğin

,

@Override 
public void actionPerformed(ActionEvent e) { 
    calculateLbl.setVisible(true); 
    new SwingWorker<Void, Void>() { 
     public Void doInBackground() throws Exception{ 
      calculate(); // this is run in a background thread 
         // take care that calculate makes no Swing calls 
      return null; 
     } 

     protected void done() { 
      show(); // this is run on the Swing event thread 
     } 
    }.execute(); 
} 

Ikaz: Kod test edilmedi/derlenmiş/veya çalıştırın.

Yukarıdaki kodla ilgili bir sorun, hesaplama yöntemi içinde atılabilecek herhangi bir özel durumla başa çıkmaması ve bunu yapmanın daha iyi bir yolunun, SwingWorker değişkeni oluşturmak, bir PropertyChangeListener öğesi eklemek ve onun SwingWorker.StateValue SwingWorker.StateValue.DONE, SwingWorker üzerinde get() arayın ve orada olası özel durumları işlemek.

+0

Anwser'ünüz için teşekkürler, örnek kod nasıl başlayacağımı anlamamda yardımcı oldu ve şimdi daha fazla düzenleme yapabilir ve devam edebilirim. – breathtaker

+0

"Calculate()" çalışırken, sonuçları karede yazdırmak için show() 'ı çağırabileceğim bir yöntem söyleyebilir misiniz? Örneğin, 'hesapla' döngüsünün içinde her 100 seferde çalışabilir. – breathtaker

+0

@breathtaker: SwingWorker'ınızdaki yayınlama/süreci kullanarak, [SwingWorker Tutorial] 'a (https://docs.oracle.com/javase/tutorial/uiswing/concurrency/worker.html) da bakmaya bakın. bu siteyi ararken Örneğin, kolayca bulunabilen [ilgili yanıtlarım] 'a (http://stackoverflow.com/search?tab=votes&q=user%3a522444%20swingworker%20publish%20process) bakın. –

İlgili konular