如何更新线程中的JApplet GUI?

时间:2013-07-17 05:11:35

标签: java multithreading swing applet

我在更新JApplet中的JLabel时遇到了问题。我正在使用SwingUtils.invokeLater但是当Applet在浏览器中时它不起作用。当我在NetBeans Applet Viewer上测试它时工作正常,但现在在浏览器中。它仅在我第一次调用sendMessage("Starting test 1");时更新,但其他调用sendMessage时不会更新GUI Applet。有什么提示吗?

这是执行一些计算的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);

}

在这里,我实现抽象方法,然后调用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);
}

感谢阅读!

1 个答案:

答案 0 :(得分:2)

所有应在event dispatch thread上构建和操作的所有 Swing GUI对象。这适用于应用程序,小程序和hybrids。此example使用SwingWorker而不是Runnable