首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >更新JFrame

更新JFrame
EN

Stack Overflow用户
提问于 2012-08-19 01:18:44
回答 2查看 1.6K关注 0票数 3

我有一个JFrame,我想在它上面模拟一个倒计时(就像火箭发射一样)。因此,我通过隐藏各种控件(setVisible(false))并显示带有文本的JLabel (这是应该倒计时的文本: 3,2,1,Go)来设置框架。

JLabel上的文本从"3“开始。我的意图是简单地让程序的执行等待1秒,然后将文本更改为"2",等待另一秒,更改为"1",等等)。最后,我隐藏了JLabel并重新显示了所有控件,一切照常进行。

我所做的是不起作用的。它似乎在等待正确的时间,当它完成时,我的JFrame看起来很棒,并按预期工作。但是在倒计时的4秒内,我看到的只是一个白色的JFrame。不是我想要的3,2,1。

这是我的代码。有没有人看到我做错了什么?谢谢!

代码语言:javascript
复制
public void countdown() {
    long t0, t1;        

    myTest.hideTestButtons(true);
    myTest.repaint();

    t0 =  System.currentTimeMillis();
    do {
        t1 = System.currentTimeMillis();
    } while ( (t1 - t0) < 1000);

    myTest.TwoSeconds();
    myTest.repaint();
    t0 =  System.currentTimeMillis();
    do {
        t1 = System.currentTimeMillis();
    } while ( (t1 - t0) < 1000);


    myTest.OneSecond();
    myTest.repaint();
    t0 =  System.currentTimeMillis();
    do {
        t1 = System.currentTimeMillis();
    } while ( (t1 - t0) < 1000);


    myTest.Go();
    myTest.repaint();
    t0 =  System.currentTimeMillis();
    do {
        t1 = System.currentTimeMillis();
    } while ( (t1 - t0) < 1000);

    myTest.hideTestButtons(false);
    myTest.repaint();
}

public void TwoSeconds() {
    lblCountdown.setText("2");
}

public void OneSecond() {
    lblCountdown.setText("1");
}

public void Go() {
    lblCountdown.setText("Go!");
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-08-19 01:34:19

请改用Timer。在大多数情况下,非常不鼓励主动等待。以下是您需要集成的代码类型:

代码语言:javascript
复制
final Timer ti = new Timer(0, null);
ti.addActionListener(new ActionListener() {
    int countSeconds = 3;

    @Override
    public void actionPerformed(ActionEvent e) {
        if(countSeconds == 0) {
            lblCountdown.setText("Go");
            ti.stop();
        } else {
            lblCountdown.setText(""+countSeconds);
            countSeconds--;
        }
    }
});
ti.setDelay(1000);
ti.start();
票数 2
EN

Stack Overflow用户

发布于 2012-08-19 01:27:50

您将希望使用javax.swing.Timer对您的应用程序进行计时。

发生的情况是,你在一个线程上运行所有的东西--所以UI (在一个单独的线程上运行)没有机会更新。

如果您想要了解其工作原理的示例,可以查看以下答案:https://stackoverflow.com/a/1006640/1515592

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12020627

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档