Java 睡眠方法锁定我的GUI

Java 睡眠方法锁定我的GUI,java,Java,我想做的是让我的程序类中的部分代码等待某个时间,但我的问题是,我试图这样做的方式使我的GUI卡住了。我的意思是,按下一个按钮,我让我的程序等待一段时间,当我的程序在等待时,我按下一个按钮,按钮被按下,但在那之后,如果我试图在程序还在等待时按下任何其他按钮,我不能,我按下的第一个按钮似乎被按下,而另一个按钮无法按下,尽管程序执行了我想要执行的操作(接受所有命令)。唯一的问题是我的GUI被锁定。您需要使用多个线程。任何需要完成的、可能需要花费大量时间的“工作”都需要在自己的线程中完成。(这当然包括您

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

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

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


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

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


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

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

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

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

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

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

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

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

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


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


java gui不在主线程上运行,而是在awt事件线程上运行。但是,所有gui操作/侦听器也在该线程上执行。java gui不在主线程上运行,而是在awt事件线程上运行。但是,所有gui操作/侦听器也在该线程上执行。这将使EDT处于睡眠状态,并使gui在5秒钟内无响应。是的,这只是Anna在问题中描述的一个示例。她的代码在一段时间内要停止以下执行。“按下一个按钮,我让我的程序等待一段时间”将它放在一个单独的可运行/线程中可以停止GUI挂起。这就是我使用invokeLater的原因。当然,她应该用实际的代码替换睡眠。这将使EDT处于睡眠状态,并使GUI在5秒钟内无响应。是的,这只是Anna在问题中描述的一个示例。她的代码在一段时间内要停止以下执行。“按下一个按钮,我让我的程序等待一段时间”将它放在一个单独的可运行/线程中可以停止GUI挂起。这就是我使用invokeLater的原因。当然,她应该用她的实际代码来代替睡眠。谢谢大家的回答。我真的很累,我必须读这些东西。我想,如果我使用Thread.sleep,我的GUI会出现问题,因为我让AWT-EventQueue-0等待,对吗?另外,如果我将连接用于我创建的另一个线程,那么我将使当前线程(显然是AWT-EventQueue-0)等待我的线程完成,因此这是相同的事情。我最终在一个指定的方法中加入了一个线程,它可以按照我的要求工作,但是任何进一步的解释都会有很大的帮助!谢谢大家!@安娜-你在这里列出的其他假设是正确的。谢谢大家的回答。我真的很累,我必须读这些东西。我想,如果我使用Thread.sleep,我的GUI会出现问题,因为我让AWT-EventQueue-0等待,对吗?另外,如果我将连接用于我创建的另一个线程,那么我将使当前线程(显然是AWT-EventQueue-0)等待我的线程完成,因此这是相同的事情。我最终在一个指定的方法中加入了一个线程,它可以按照我的要求工作,但是任何进一步的解释都会有很大的帮助!谢谢大家!@安娜-你在这里列出的其他假设是正确的。