Java JLabel在setText()之后消失
我正在用Swing以MVC方式建立一个模拟程序。从外部线程调用JLabel上的setText时遇到问题。我知道Swing有自己的线程模型(尽管setText是线程安全的),所以我也尝试过通过SwingUtilities函数强制EDT执行setText调用,但没有结果 这就是类的外观-我省略了不相关的块,假设它们相互引用,并且GUI的布局设置正确: 预期行为:Java JLabel在setText()之后消失,java,multithreading,swing,jlabel,settext,Java,Multithreading,Swing,Jlabel,Settext,我正在用Swing以MVC方式建立一个模拟程序。从外部线程调用JLabel上的setText时遇到问题。我知道Swing有自己的线程模型(尽管setText是线程安全的),所以我也尝试过通过SwingUtilities函数强制EDT执行setText调用,但没有结果 这就是类的外观-我省略了不相关的块,假设它们相互引用,并且GUI的布局设置正确: 预期行为: 按钮按下了 在控制器上调用input() 创建了一个新线程,它首先将标签的文本设置为“YEP” 新创建的线程使用thread.sleep(
控制器上调用input()
标签的文本设置为“YEP”
thread.sleep()
标签的文本设置为“NOPE”
我做错了什么?当心,Swing不是线程安全的。您可以考虑使用Swing <代码>计时器< /> >而不是<代码> Excel服务>代码>考虑提供一个演示您的问题的方法。这不是一个代码转储,而是您正在做的一个示例,它突出了您所遇到的问题。这将减少混乱和更好的响应请显示更多代码。我添加了一个main方法,将标签和按钮添加到框架中,并在我的计算机上使用我的代码运行(即标签不会消失,但显示“YEP”/“NOPE”),注意,Swing不是线程安全的。您可以考虑使用Swing <代码>计时器< /> >而不是<代码> Excel服务>代码>考虑提供一个演示您的问题的方法。这不是一个代码转储,而是您正在做的一个示例,它突出了您所遇到的问题。这将减少混乱和更好的响应请显示更多代码。我添加了一个main方法,将标签和按钮添加到框架中,并在我的计算机上使用我的代码进行操作(即标签不会消失,但显示“是”/“否”)
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);
}
});
}
}