Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JLabel在setText()之后消失_Java_Multithreading_Swing_Jlabel_Settext - Fatal编程技术网

Java JLabel在setText()之后消失

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(

我正在用Swing以MVC方式建立一个模拟程序。从外部线程调用JLabel上的setText时遇到问题。我知道Swing有自己的线程模型(尽管setText是线程安全的),所以我也尝试过通过SwingUtilities函数强制EDT执行setText调用,但没有结果

这就是类的外观-我省略了不相关的块,假设它们相互引用,并且GUI的布局设置正确:

预期行为:

  • 按钮按下了
  • 控制器上调用
    input()
  • 创建了一个新线程,它首先将
    标签的文本设置为“YEP”
  • 新创建的线程使用
    thread.sleep()
  • 它会唤醒并将
    标签的文本设置为“NOPE”
  • 我得到的是,在第3点调用后,标签消失,但在第5点再次绘制,显示文本“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);
                }
            });
        }
    }