Java 如何在线程中更新JApplet GUI?

Java 如何在线程中更新JApplet GUI?,java,multithreading,swing,applet,Java,Multithreading,Swing,Applet,我在更新JApplet内的JLabel时遇到了问题。我正在使用SwingUtils.invokeLater,但当小程序在浏览器中时,它不工作。当我在NetBeans小程序查看器上测试它时,它工作正常,但现在在浏览器中。它仅在我第一次调用sendMessage(“启动测试1”)时更新但是其他调用sendMessage不会更新GUI小程序。有什么建议吗 下面是执行一些计算的类: public abstract class ConDiagnoseTool implements Runnable{ @

我在更新JApplet内的JLabel时遇到了问题。我正在使用SwingUtils.invokeLater,但当小程序在浏览器中时,它不工作。当我在NetBeans小程序查看器上测试它时,它工作正常,但现在在浏览器中。它仅在我第一次调用
sendMessage(“启动测试1”)时更新
但是其他调用
sendMessage
不会更新GUI小程序。有什么建议吗

下面是执行一些计算的类:

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);

}
在这里,我实现了抽象方法,然后在GUI线程中调用whitin:

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);
}

谢谢你的阅读

所有Swing GUI对象应仅在上构造和操作。这适用于应用程序、小程序和应用程序。这使用了
SwingWorker
而不是
Runnable

对我来说很好,得到了一个工作示例。事件总是在
事件调度程序线程上触发,因此不需要在
actionPerformed(…)
方法中使用
invokeLater
。@MadProgrammer,您在浏览器上测试过它吗?因为它在Netbeans小程序查看器上运行良好,我已经说过了。@nIcEcOw那么,为什么它不更新GUI?@nIcEcOw不,没有。一些事件将从引发它们的上下文中触发,在本例中,设置标签文本将从调用的线程的上下文中完成,但我已经在这样做了。不不管怎么说,奇怪的是,它在Netbeans小程序查看器上更新得很好,但在浏览器中却没有;不同的环境可能会暴露产生的竞争条件。