我在更新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上正常工作,我已經說過了。 –