0

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

这是执行一些计算的类:

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

感谢您阅读!

4

1 回答 1

2

所有Swing GUI 对象都应该事件调度线程上构建和操作。这适用于应用程序、小程序和混合。此示例使用SwingWorker而不是Runnable.

于 2013-07-17T12:02:09.620 回答