【问题标题】:Java Thread.sleep not working with guiJava Thread.sleep 不适用于 gui
【发布时间】:2017-10-08 11:10:01
【问题描述】:

我试图让程序等待用户点击 GUI。 但是Thread.sleep() 只是让整个 GUI 休眠。所以我只能看到一个空窗口。

代码:

while (!enteredField) {
    try {
        Thread.sleep(10);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

【问题讨论】:

  • 你最好使用Swing Timers
  • 你不能在 gui 中使用 thread.sleep,你需要使用其他方法
  • 从点击事件处理程序继续你的逻辑
  • UI 应用程序始终是 UI 驱动的。它总是只是坐在那里等待事件发生。所以单独你的问题标题没有意义。可能您正在进行某种“活动”;你想放慢速度;或暂停;然后你真的从@MadProgrammer 给你的那个链接开始。或者他给你的第二个链接。并且“它不是重复的”在这里没有帮助 - 应该解释你想要实现的目标;并弄清楚为什么其他问题对您没有帮助。你现在得到了几个很好的建议。退后一步,消化一下!

标签: java multithreading swing user-interface


【解决方案1】:

我以前也遇到过这样的问题。所以你并不孤单。我犯了这样的错误。

您的问题

while (!enteredField) {
    try {
        Thread.sleep(10);
    } catch (InterruptedException e) {
        e.printStackTrace();
     }
}

解决方案

Thread thread = new Thread(() -> {
    while (!enteredField) {
        try {
            Thread.sleep(10);
        } catch (InterruptedException e) {
            e.printStackTrace();
         }
    }
});
thread.start();

*详细回复*


' W你所做的是你在一个while循环中创建了一个线程。基本上你暂停了整个 GUI 10 毫秒,事实上整个程序。此外,我不明白你的目标是什么。你说你想等待用户点击 GUI。建议是,听按钮点击。例如 Button.setOnAction(() -> {});那将做他的工作而不是睡觉。我只是你想要暂停或睡觉的唯一情况是如果你正在为某些东西制作动画。

【讨论】:

    【解决方案2】:

    Swing 事件需要在 Event Dispatch Thread 上发生。

    你试过了吗

    SwingUtilities.invokeAndWait(() -> Thread.sleep(20))
    

    https://docs.oracle.com/javase/8/docs/api/javax/swing/SwingUtilities.html#invokeAndWait--?

    【讨论】:

    • 执行此操作,EDT 将引发异常。如果您尝试从后台线程执行此操作,您仍会在 EDT 上调用 Thread.sleep,这无法解决问题
    • 我什至不知道那是什么意思。
    • 我尝试了那个代码。它起作用了,它显示了一切。但是当我点击它时它不会更新。
    • 不要在 EDT 中调用 Thread.sleep()(或者,就此而言,任何阻塞的方法)!这将导致整个 GUI 变得无响应,这可能不是 OP 想要的。正如其他人建议的那样,使用Timer
    • @ostrichofevil 根据 OP 提供(或缺少)的信息,Timer 可能不是合适的解决方案,ActionListener 可能是更好的解决方案 - 尽管同意其他所有内容跨度>
    猜你喜欢
    • 1970-01-01
    • 2017-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-16
    • 1970-01-01
    • 1970-01-01
    • 2016-08-13
    相关资源
    最近更新 更多