【问题标题】:Sleep method locks my GUI睡眠方法锁定了我的 GUI
【发布时间】:2011-12-31 03:57:59
【问题描述】:

我想要做的是让我的程序类中的某些部分代码等待一段时间,但我的问题是我尝试它的方式使我的 GUI 卡住了。我的意思是,按下一个按钮我让我的程序等待一段时间,当我的程序等待时我按下一个按钮,按钮被按下但之后如果我在程序仍在等待时尝试按下任何其他按钮我不能,我按下的第一个按钮似乎被按下,而另一个按钮无法按下,尽管程序做了我想做的事情(接受所有命令)唯一的问题是我的 GUI 被锁定了。

【问题讨论】:

    标签: java


    【解决方案1】:

    您需要使用多个线程。任何需要完成且可能需要大量/明显时间的“工作”都需要在其自己的线程中完成。 (这当然包括您调用sleep 的任何代码。)

    这里有 3 个很好的参考资料:

    【讨论】:

    • 谢谢大家的回答。我真的很困惑,我必须阅读这些东西。我想如果我使用 Thread.sleep 我的 GUI 会卡住,因为我让 AWT-EventQueue-0 等待,对吧?此外,如果我将连接用于我创建的另一个线程,我正在使当前线程(显然是 AWT-EventQueue-0)等待我的线程完成,所以这是同一回事。我终于在指定的方法中放置了一个线程,它可以按我的意愿工作,但任何进一步的解释都会有很大帮助!谢谢!
    • @anna - 你在这里列出的其他假设是正确的。
    【解决方案2】:

    对于您正在睡眠的部分以及按下第一个按钮后,您可以尝试以下操作:

    SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
            }
            //and whatever you need to do
        }
    });
    

    如果您需要在按钮按下方法中使用任何局部变量,则它们需要是最终变量。

    【讨论】:

    • 这将使 EDT 进入睡眠状态并使 GUI 无响应 5 秒。
    • 是的,这只是 Anna 在问题中描述的一个例子。她的代码有一些东西可以在一段时间内停止以下执行。 “按下一个按钮我让我的程序等待某个时间”将它放在单独的可运行/线程中可以停止 GUI 挂起。这就是我使用invokeLater 的原因。当然,她应该用她的实际代码替换 sleep。
    【解决方案3】:

    您没有提供任何代码,因此无法直接输入您的代码。如果您使用的是 Swing 并且需要执行耗时的处理,请使用 Swing Worker 线程。下面是使用SwingWorker类的教程:

    Using a Swing Worker Thread

    【讨论】:

      【解决方案4】:

      您的 GUI 已加载并在一个线程上运行,您的等待功能在同一线程上运行,从而锁定了 GUI。您需要在单独的线程上启动等待功能。

      【讨论】:

      • java gui 不在主线程上运行,它在 awt 事件线程上运行。但是,所有 gui 操作/侦听器也在该线程上执行。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多