2013-07-17 51 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