Java 如何在线程中更新JApplet GUI?
我在更新JApplet内的JLabel时遇到了问题。我正在使用SwingUtils.invokeLater,但当小程序在浏览器中时,它不工作。当我在NetBeans小程序查看器上测试它时,它工作正常,但现在在浏览器中。它仅在我第一次调用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{ @
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小程序查看器上更新得很好,但在浏览器中却没有;不同的环境可能会暴露产生的竞争条件。