Java 简单摆动延迟

Java 简单摆动延迟,java,swing,event-dispatch-thread,thread-sleep,Java,Swing,Event Dispatch Thread,Thread Sleep,在swing应用程序中,我有一个弹出的jDialog,弹出一个jlabel,上面写着“等待5秒” 5秒钟后,标签应该变为OK,现在我完成了。并应显示一个按钮,允许用户单击“继续” 在下面链接到导致弹出的按钮的示例操作中,弹出窗口按其应有的方式显示,但为空,而不是说“挂起5秒”。5秒钟后,所有内容都会更新,标签和按钮也在那里。发生了什么事?在重新油漆或其他东西之前,线程是否休眠 @Action public void popUp() { popUpDialog.setSiz

在swing应用程序中,我有一个弹出的jDialog,弹出一个jlabel,上面写着“等待5秒”

5秒钟后,标签应该变为OK,现在我完成了。并应显示一个按钮,允许用户单击“继续”

在下面链接到导致弹出的按钮的示例操作中,弹出窗口按其应有的方式显示,但为空,而不是说“挂起5秒”。5秒钟后,所有内容都会更新,标签和按钮也在那里。发生了什么事?在重新油漆或其他东西之前,线程是否休眠

@Action
    public void popUp() {
        popUpDialog.setSize(300,200);
        popUpDialog.setLocationRelativeTo(null);
        popUpDialog.setVisible(true);

        popUpLabel.setVisible(true);
        popUpLabel.setText("Working, hang on a sec....");

        try {
            Thread.sleep(5000);
        } catch (InterruptedException ex) {
            Thread.currentThread().interrupt();
        }

        popUpLabel.setText("Okay Now I'm Done.");
        popUpBut.setVisible(true);
    }
编辑:所以我尝试了这个,试图用一个摆动计时器来代替线程休眠:

@Action
        public void popUp() {
            popUpDialog.setSize(300,200);
            popUpDialog.setLocationRelativeTo(null);
            popUpDialog.setVisible(true);

            popUpLabel.setVisible(true);
            popUpLabel.setText("Working, hang on a sec....");

            Timer timer = new Timer(speed, this);
            timer.setInitialDelay(pause);
            timer.start(); 

            popUpLabel.setText("Okay Now I'm Done.");
            popUpBut.setVisible(true);
        }
显然,我需要更多的代码来完成计时器,但我马上得到一个未找到的符号,变量:timer error。这是怎么回事?我做错了吗

编辑2:我更改了计时器声明,解决了一个问题,但创建了另一个问题。现在我得到了关于速度的符号not found错误。我以前从未使用过摆动计时器,也不知道如何使用。关于这个主题的java教程很复杂,很难理解。你们中有谁能给我举一个简单明了的计时器示例,让我从中学习,并找出我需要做什么

我有一个弹出的jDialog,它弹出一个jlabel,上面写着等待5秒

您有一个对话框,该对话框在以下操作之前可见:

您可以在标签上设置文本 线程。睡眠 popupDialog.setVisibletrue后面的代码在对话框关闭之前不会执行。重新排列你的代码

此外,您还需要使用计划表来安排文本的更改

       popUpLabel.setVisible(true);
       popUpLabel.setText("Working, hang on a sec....");
我有一个弹出的jDialog,它弹出一个jlabel,上面写着等待5秒

您有一个对话框,该对话框在以下操作之前可见:

您可以在标签上设置文本 线程。睡眠 popupDialog.setVisibletrue后面的代码在对话框关闭之前不会执行。重新排列你的代码

此外,您还需要使用计划表来安排文本的更改

       popUpLabel.setVisible(true);
       popUpLabel.setText("Working, hang on a sec....");
应该是

       popUpLabel.setText("Working, hang on a sec....");
       popUpLabel.setVisible(true);
在此之后,应将对话框设置为可见

您还可以保持代码的顺序不变,并强制更新标签/面板。虽然在这种情况下,这似乎不是一个合乎逻辑的选择

应该是

       popUpLabel.setText("Working, hang on a sec....");
       popUpLabel.setVisible(true);
在此之后,应将对话框设置为可见


您还可以保持代码的顺序不变,并强制更新标签/面板。尽管在这种情况下,这似乎不是一个合乎逻辑的选择

如果修改Swing组件状态的代码在这里的EDT上,那么即使调用了repaint,也不会使用第一个文本重新绘制标签,因为在最后一次重新绘制之前排队的所有其他EDT请求都需要在到达该重新绘制之前完成,而您的代码就是排队的EDT事件之一

如果调用repaint,它会向队列中添加一个repaint,而不会立即重新绘制。您在此处的操作将导致5秒钟的等待,下一次重新绘制之前的标签仅包含您上次将其设置为的文本,因为在EDT上排队的代码在进入下一次排队之前已完全执行

尝试使用Swing计时器,从Swing计时器触发的事件已经在EDT上执行,因此这正是您所需要的,这里的一个事件是您最初设置文本的,另一个事件是Swing计时器触发的,用于在5秒后更改文本

编辑,根据作者的要求,5秒后摆动计时器触发一次的示例:

    // set first jlabel text here

    ActionListener task = new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            System.out.println("This is on the EDT after 5 seconds, " +
                "well depending on if I'm used with a Timer, and if " +
                "the right options are set to that Timer");
            // set second jlabel text here
        }
        };
    Timer timer = new Timer(5000 , task);
    timer.setRepeats(false);
    timer.start();

如果修改Swing组件状态的代码位于此处的EDT上,则即使调用了repaint,也不会使用第一个文本重新绘制标签,因为在最后一次重新绘制之前排队的所有其他EDT请求都需要在到达该重新绘制之前完成,这里的代码是排队的EDT事件之一

如果调用repaint,它会向队列中添加一个repaint,而不会立即重新绘制。您在此处的操作将导致5秒钟的等待,下一次重新绘制之前的标签仅包含您上次将其设置为的文本,因为在EDT上排队的代码在进入下一次排队之前已完全执行

尝试使用Swing计时器,从Swing计时器触发的事件已经在EDT上执行,因此这正是您所需要的,这里的一个事件是您最初设置文本的,另一个事件是Swing计时器触发的,用于在5秒后更改文本

编辑,根据作者的要求,5秒后摆动计时器触发一次的示例:

    // set first jlabel text here

    ActionListener task = new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            System.out.println("This is on the EDT after 5 seconds, " +
                "well depending on if I'm used with a Timer, and if " +
                "the right options are set to that Timer");
            // set second jlabel text here
        }
        };
    Timer timer = new Timer(5000 , task);
    timer.setRepeats(false);
    timer.start();

必须有两个摆动计时器,一个有两个状态,在EDT上执行?没有工作的画,等一下。。。。如果您设置文本,将EDT冻结5秒,然后在重新绘制之前将文本更改为其他内容,则将完成此操作。你也应该使用另一种计时机制,比如秋千计时器。我认为你说得对,它在油漆前睡觉。你有没有试过在睡觉前重新画一幅画

所有swing应用程序都在一个线程上吗?那么是吗?我可以在等待之前强制重新绘制吗?在我的第一条评论中,如果您正在调用重新绘制,并且您修改Swing组件状态的代码在这里的EDT上,那么在您的EDT代码结束之前,以及在最后一次重新绘制完成之前排队的所有其他EDT请求之前,不会进行重新绘制。是的,Swing是单线程的,一次只执行一个操作,如果这段代码在EDT上,那么同一个线程不可能同时执行重绘。这是您应该使用Swing计时器的另一个原因,无论您的Swing代码是线程安全的,睡眠都不会工作。必须有两个Swing计时器,一个具有两种状态,EDT上是否正在执行弹出窗口?没有工作的画,等一下。。。。如果您设置文本,将EDT冻结5秒,然后在重新绘制之前将文本更改为其他内容,则将完成此操作。你也应该使用另一种计时机制,比如秋千计时器。我认为你说得对,它在油漆前睡觉。你试过在睡觉前插入一个重绘吗?我以为所有的swing应用程序都在一个线程上?那么是吗?我可以在等待之前强制重新绘制吗?在我的第一条评论中,如果您正在调用重新绘制,并且您修改Swing组件状态的代码在这里的EDT上,那么在您的EDT代码结束之前,以及在最后一次重新绘制完成之前排队的所有其他EDT请求之前,不会进行重新绘制。是的,Swing是单线程的,一次只执行一个操作,如果这段代码在EDT上,那么同一个线程不可能同时执行重绘。这是您应该使用Swing计时器的另一个原因,无论您的Swing代码是线程安全的,睡眠都无法工作。如何重新排序?我还试着添加timer=newtimerspeed,这个;etc代替try块,但是IDE只是说找不到符号变量:timerBy实际上只是更改代码中的顺序。setVisible应该是您调用的最后一个方法;你想要定时器=新的定时器速度,这个;我想我应该把它扔掉error@fildred13,则需要添加代码以更改标签,然后才能使对话框可见。在显示对话框之前,您需要启动计时器?我还试着添加timer=newtimerspeed,这个;etc代替try块,但是IDE只是说找不到符号变量:timerBy实际上只是更改代码中的顺序。setVisible应该是您调用的最后一个方法;你想要定时器=新的定时器速度,这个;我想我应该把它扔掉error@fildred13,则需要添加代码以更改标签,然后才能使对话框可见。你需要先启动计时器,然后才能显示对话框。结果是相同的:空白屏幕5秒钟,然后出现了更改的标签和按钮。我尝试了这个。结果是相同的:空白屏幕5秒钟,然后出现了更改的标签和按钮。正如我在第二次编辑中添加的:您能指出一个简单、清晰的摆动计时器示例,以便我知道如何使用它吗?java tuts one非常混乱。当然,发布了。确保导入javax.swing.Timer,而不是意外地导入java.util.Timer。这我理解。非常感谢!NP如果你想要一本关于Swing的好书,我会推荐《肮脏的富人客户》这本书。另外,有时候各种类的javadocs都有很好的快速用例,如果你检查Swing Timer,你会发现它有一个快速用例,这基本上就是我发布的,有时候检查起来也很方便。正如我在第二次编辑中所添加的:您能指出一个简单、清晰的swing计时器的示例吗?这样我就可以知道如何使用它了?java tuts one非常混乱。当然,发布了。确保导入javax.swing.Timer,而不是意外地导入java.util.Timer。这我理解。非常感谢!NP如果你想要一本关于Swing的好书,我会推荐《肮脏的富人客户》这本书。另外,有时候各种类的javadocs都有很好的快速用例,如果你检查Swing Timer,你会发现它有一个快速用例,这基本上就是我发布的,有时候检查起来也很方便。