我在更新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);
}
感谢您阅读吧!
对我来说工作很好,有一个工作示例.. – MadProgrammer
事件总是在'Event Dispatcher Thread'上触发,所以'actionPerformed(...)'方法中不需要使用'invokeLater'。 –
@MadProgrammer,你在浏览器上测试过它吗?因为它在Netbeans Applet Viewer上正常工作,我已经说过了。 –