Java Swing使线程等待一次

Java Swing使线程等待一次,java,multithreading,swing,swingworker,Java,Multithreading,Swing,Swingworker,我试图让我的图形用户界面在最近的图形更新后等待2秒钟。这意味着在我使用之后: boardLogo.repaint(); boardLogo.revalidate(); 我希望GUI在进行进一步计算之前等待,然后再次绘制它们 守则: SwingUtilities.invokeLater(new Runnable() { @SuppressWarnings("rawtypes") @Override

我试图让我的图形用户界面在最近的图形更新后等待2秒钟。这意味着在我使用之后:

    boardLogo.repaint();
    boardLogo.revalidate();
我希望GUI在进行进一步计算之前等待,然后再次绘制它们

守则:

        SwingUtilities.invokeLater(new Runnable() {
            @SuppressWarnings("rawtypes")
            @Override
            public void run() {
                SwingWorker swingWorkerExample = new SwingWorker(){
                    @Override
                    protected Object doInBackground() throws Exception {
                        return null;
                    }
                    protected void done(){
                        try {
                            Thread.sleep(2000); //wait 2 seconds.
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                };
                swingWorkerExample.execute();
            }
        });
        //.... more code here
        boardLogo.repaint();
        boardLogo.revalidate();
但是当我运行它时-首先它执行最后两行,然后等待2秒钟

老实说,我对线程和JavaSwing的了解并不是最好的(特别是在理解SwingWorker方面,我已经试着从Oracle网站上读到了这方面的内容),所以如果能给出详细的答案,我将不胜感激

谢谢

当我运行它-首先它执行最后两行,然后等待2秒。。。我对线程和JavaSwing的了解不是最好的

你说,它执行最后两行。有没有停下来想知道这是什么

这是一根线。线程是Java程序中执行代码的部分,执行的每一行都由某个线程执行

当您的代码调用
invokeLater()
时,它正在提交一个任务(即一段代码),由Swing的事件调度线程(EDT)执行;当您的代码调用
swingWorker.execute()
时,它正在提交一个由Swing后台线程之一执行的任务

一个程序中有多个线程的全部意义在于,它们可以同时做不同的事情

在您的例子中,您让EDT休眠了两秒钟,同时,其他线程正在调用
boardLogo.repaint()
boardLogo.revalidate()


关于Swing和多线程,有两件重要的事情需要了解:

  • 所有事件处理程序都将由EDT运行

  • 事件处理程序不应执行任何超过一小部分秒的操作,因为在处理程序返回之前,您的应用程序将无法响应任何其他事件(即,它将显示为“挂起”)

  • 不允许其他线程与Swing的任何GUI组件交互

invokeLater()
的一个重要用例是,后台线程中运行的代码如何与GUI组件通信。invokeLater()提交将在EDT中运行的任务(即一段代码)

SwingWorker的主要用例与此相反:它是一个在EDT中运行的事件处理程序如何启动一个需要花费超过一小部分秒才能完成的任务


通过学习Swing并发教程,您可以了解这些内容:

当我运行它-首先它执行最后两行,然后等待2秒。。。我对线程和JavaSwing的了解不是最好的

你说,它执行最后两行。有没有停下来想知道这是什么

这是一根线。线程是Java程序中执行代码的部分,执行的每一行都由某个线程执行

当您的代码调用
invokeLater()
时,它正在提交一个任务(即一段代码),由Swing的事件调度线程(EDT)执行;当您的代码调用
swingWorker.execute()
时,它正在提交一个由Swing后台线程之一执行的任务

一个程序中有多个线程的全部意义在于,它们可以同时做不同的事情

在您的例子中,您让EDT休眠了两秒钟,同时,其他线程正在调用
boardLogo.repaint()
boardLogo.revalidate()


关于Swing和多线程,有两件重要的事情需要了解:

  • 所有事件处理程序都将由EDT运行

  • 事件处理程序不应执行任何超过一小部分秒的操作,因为在处理程序返回之前,您的应用程序将无法响应任何其他事件(即,它将显示为“挂起”)

  • 不允许其他线程与Swing的任何GUI组件交互

invokeLater()
的一个重要用例是,后台线程中运行的代码如何与GUI组件通信。invokeLater()提交将在EDT中运行的任务(即一段代码)

SwingWorker的主要用例与此相反:它是一个在EDT中运行的事件处理程序如何启动一个需要花费超过一小部分秒才能完成的任务



通过学习Swing并发教程,您可以了解这方面的内容:

使用javax.Swing.Timer.Thank。虽然我在函数中,没有计时器构造函数所需的ActionListener。。。除了将侦听器本身发送到函数之外,我还能做什么?使用javax.swing.Timer.Thank。虽然我在函数中,没有计时器构造函数所需的ActionListener。。。除了将侦听器本身发送到函数之外,我还能做什么?谢谢!我已经在上面的链接中阅读了你的评论和教程,但我仍然没有完全理解。如果我理解正确,为了在不冻结GUI的情况下等待2秒钟,我需要在SwingWorker中执行此操作,因为它的目的是用于长任务。但我仍然无法让它工作,所以它将等待2秒,然后再次更新GUI。。。尝试使用教程中列出的get()方法,但我得到了相同的结果:GUI在第一次更新之前冻结2秒,在两次更新GUI之后冻结2秒…@orohev“让我的GUI等待”是什么意思?如果您想在某个事件发生两秒钟后绘制某物,通常的方法是设置一个
javax.swing.Timer
,它将在两秒钟后绘制。如果要阻止用户操作某些控件两秒钟,通常的方法是禁用