2014-04-08 52 views
0

按下按鈕後,調用actionPerformed。 a。啓動新Thread這樣的:In actionPerformed重繪不適用於新線程

public void actionPerformed(ActionEvent evt) { 
    try { 
     Runnable r = new Runnable() { 
      public void run() { 
       try { 
        mylabel.setText("new text"); 
        mylabel.revalidate(); 
        mylabel.repaint(); 
       } catch (Exception x) { 
        x.printStackTrace(); 
       } 
      } 
     }; 

     Thread thread = new Thread(r); 
     thread.start(); 
     MyFunction(); 

    // ... 

上。之後myLabel字符串,new text,不會出現,只是後actionPerformed運行。

回答

0

您應該在Event Dispatch Thread(EDT)中運行與GUI相關的代碼。不要創建另一個線程。

public void actionPerformed(ActionEvent evt) { 
    try { 
     SwingUtilities.invokeLater(
      new Runnable() { 
       ... 

如果actionPerformed是偵聽器回調,它已經在EDT上運行。如果回調執行需要很長時間,則創建另一個 Runnable,否則會「減慢」GUI。

如果MyFunction()方法與GUI重繪或類似的東西無關, 在另一個線程上運行它,特別是如果它是資源密集型的。

相關問題