2013-07-17 78 views
0

我在更新JApplet中的JLabel時遇到了問題。我使用的是SwingUtils.invokeLater,但當Applet在瀏覽器內時它不工作。當我在NetBeans Applet Viewer上測試它時,它工作正常,但現在在瀏覽器中。它只會在我第一次調用sendMessage("Starting test 1");時更新,而其他調用sendMessage時不會更新GUI Applet。有小費嗎?如何更新線程內的JApplet GUI?

這裏是執行一些計算的CLASSE:

public abstract class ConDiagnoseTool implements Runnable{ 

@Override 
public void run(){ 
    String result = ""; 
    try { 
     sendMessage("Starting test 1"); 
     result += execute(); 
     result += execute(); 
     sendMessage("Starting test 2"); 
     result += execute(); 
     sendMessage("Starting test 3"); 
     result += execute(); 
    } catch (IOException e) { 
     result += e.toString(); 
    } 
    sendResult(result); 
    sendMessage("Test finished."); 
} 

[...] 

[...] 

abstract void sendMessage(final String message); 

abstract void sendResult(final String result); 

} 

在這裏我實現抽象方法,然後調用whitin一個GUI線程:

private void btnStartActionPerformed(java.awt.event.ActionEvent evt) {           
    new Thread(new ConDiagnoseTool() { 
     @Override 
     void sendMessage(final String message) { 
      SwingUtilities.invokeLater(new Runnable() { 
       @Override 
       public void run() { 
        jStatus.setText(message); 
       } 
      }); 
     } 

     @Override 
     void sendResult(final String result) { 
      SwingUtilities.invokeLater(new Runnable() { 
       @Override 
       public void run() { 
        jResult.setText(result); 
       } 
      }); 
     } 
    }).start(); 
    btnStart.setEnabled(false); 
} 

感謝您閱讀吧!

+0

對我來說工作很好,有一個工作示例.. – MadProgrammer

+0

事件總是在'Event Dispatcher Thread'上觸發,所以'actionPerformed(...)'方法中不需要使用'invokeLater'。 –

+0

@MadProgrammer,你在瀏覽器上測試過它嗎?因爲它在Netbeans Applet Viewer上正常工作,我已經說過了。 –

回答

2

所有搖擺GUI對象應當被構造並僅在event dispatch thread操縱。這適用於應用程序,小應用程序和hybrids。這example使用SwingWorker而不是Runnable

+0

但是我已經這麼做了。沒有?無論如何,奇怪的問題是,它在Netbeans Applet Viewer上更新正常,但在瀏覽器中不會更新。 –

+0

不,沒有[sscce](http://sscce.org/),我看不到你在哪裏做;不同的環境可能會暴露最終的競爭狀況。 – trashgod