我正在使用Swing以MVC方式设置模拟程序。我在从外部线程调用JLabel上的setText时遇到了麻烦。我知道Swing有自己的线程模型(虽然setText是线程安全的),所以我也试图强迫setTxt调用由EDT通过SwingUtilities函数执行,没有结果。
这就是类的样子 - 我省略了不相关的块,假设它们彼此有引用并且GUI的布局已正确设置:
public class View extends JFrame
{
private final JLabel label = new JLabel("idle");
private final JButton button = new JButton("press me");
public View(final Controller controller)
{
this.controller = controller;
button.addListener(e -> controller.input());
}
public void refresh(final boolean value)
{
label.setText(value ? "YEP" : "NOPE");
}
}
public class Controller
{
private final ExecutorService service =
Executors.newSingleThreadExecutor();
public void input()
{
service.submit((Runnable) () ->
{
try
{
view.refresh(true);
Thread.sleep(1000);
}
catch(final InterruptedException exception)
{
exception.printStackTrace();
}
finally
{
view.refresh(false);
}
});
}
}
预期行为:
input()
上调用controller
label
的文本设置为" YEP" Thread.sleep()
label
的文字设置为" NOPE" 我得到的是,在第3点的通话之后,标签消失,,但再次以5 绘制,显示文字" NOPE"。 我做错了什么?