JLabel在setText()后消失

时间:2016-04-16 08:18:38

标签: java multithreading swing jlabel settext

我正在使用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);
            }
        });
    }
}

预期行为:

  1. 按下按钮
  2. input() 上调用
  3. controller
  4. 创建一个新主题,首先将label的文本设置为" YEP"
  5. 新创建的主题使用Thread.sleep()
  6. 模拟一些延迟
  7. 唤醒并将label的文字设置为" NOPE"
  8. 我得到的是,在第3点的通话之后,标签消失,,但再次以5 绘制,显示文字" NOPE"。 我做错了什么?

0 个答案:

没有答案