2015-05-13 29 views
0

我有一個JButton和一個JLabel。編寫代碼的目的是當用戶點擊按鈕時,執行的操作會更改JLabel的文本並開始執行某些操作。但是,實際上,標籤文本不會改變,直到正在完成的東西完成。Swing - 不再發生UI的重新驗證

這是按鈕動作

lbl.setText("Doing"); 
revalidate(); 
DoStuff(); 

代碼標籤的文本不會改變,直到方法DoStuff回報。我知道revalidate只是安排電話paint,所以我認爲這是因爲繪製線程從來沒有得到一個切片來改變文本。

我該如何解決這個問題?

這是一個repro程序。而不是DoStuff(),我有一個while(true);模擬相同的行爲。如果你運行這個程序,你必須殺死它才能退出。

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

public class Util1 
{ 
    public static void main(String[] args) 
    { 
     new Util1(); 
    } 

    public Util1() 
    { 
     EventQueue.invokeLater(new Runnable() 
     { 
      public void run() 
      { 

       JFrame frame = new JFrame("Test"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setLayout(new BorderLayout()); 
       frame.add(new ExamplePane()); 

       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 


    protected class ExamplePane extends JPanel 
    { 
     public ExamplePane() 
     { 
      final JPanel panel = new JPanel(new GridBagLayout()); 

      JButton btn = new JButton("Do Stuff"); 
      final JLabel lbl = new JLabel("Status"); 
      add(btn); 
      add(lbl); 

      btn.addActionListener(new ActionListener() 
      { 
       public void actionPerformed(ActionEvent ae) 
       { 
        lbl.setText("Doing"); 
        revalidate(); 
        while(true); 
       } 
      }); 

     }    
    }   
} 

回答

1

的事情是,在public void actionPerformed(ActionEvent ae)方法行動Swing線程中執行。在執行所有動作之前不會顯示更改。例如,您可以在另一個線程中執行您的doStaff方法。 有關更多詳細信息,請參閱this topic。我有同樣的問題。