3

我对 Java 非常陌生(只使用了大约一周),并且正在开发商店模拟器。基本上我只想立即完成基本的事情,比如在屏幕上显示一个关闭前的时间和打开后的一段时间。

我在我的 Simulation extends javax.swing.JFrame 类中做了以下函数:

public void incOpenTime() {
    timeOpen++;
    int hours = timeOpen / 3600;
    int minutes = (timeOpen % 3600) / 60;
    int seconds = (timeOpen % 3600) % 60;
    this.openTime.setText((hours < 10 ? "0" : "") + hours
            + ":" + (minutes < 10 ? "0" : "") + minutes
            + ":" + (seconds < 10 ? "0" : "") + seconds);
    decTimeLeft();
    }

public void decTimeLeft() {
    int remainingTime = 28800 - timeOpen;
    int hours = remainingTime / 3600;
    int minutes = (remainingTime % 3600) / 60;
    int seconds = (remainingTime % 3600) % 60;
    this.timeLeft.setText((hours < 10 ? "0" : "") + hours
            + ":" + (minutes < 10 ? "0" : "") + minutes
            + ":" + (seconds < 10 ? "0" : "") + seconds);

    }

使用 setText() 方法的 openTime 和 timeLeft 变量是 GUI 本身的一部分。

主要是这样调用incOpenTime:

while(this.timeOpen < 28800) 
{
    incOpenTime();

}

首先,当我运行它时,它基本上只是通过循环并仅在最后一次输出到屏幕。我将如何做到这一点,使时代不断变化?

其次,我想稍微延迟一下……也许每秒大约 1 毫秒,这样模拟运行速度会更慢,并且输出到屏幕(稍后)的其他数据更具可读性。我试过 Thread.sleep(1); 在循环中,但在更改时不显示数字。

请帮忙。

谢谢

编辑:

这是我为使其正常工作所做的工作。主要:

timer = new Timer();
for(int i=1; i<= 28800; i++)
{
        timer.schedule(new task(), 1*i);

}

新建了一个类:

class task extends TimerTask {

    @Override
    public void run() {
        incOpenTime();
        }
}
4

3 回答 3

5

javax.swing.Timer可能是一个不错的选择,作为“Timers在……事件调度线程上执行的动作事件处理程序”。这里有一个例子。

于 2011-09-04T23:03:09.507 回答
3

您从 BackGroung Task 或 Thread 到 GUI 的输出未正确发布到 EDT,

您必须将任何输出到 GUI(从 BackGroung 任务或线程)包装到

invokeLater()

如果方法可以同步然后

invokeAndWait()

请阅读更多关于Swing 中的并发性

于 2011-09-04T22:46:48.247 回答
0

你需要一个java.util.Timer

编辑:由于这是公认的答案,重要的是要注意应该在事件调度线程上TimerTask执行它。@mKorbel 的回答Runnable中指出了这种方法的正确变体。下面有一个简短的示例,这里有一个更详细的示例。@Hovercraft 建议的一种更简单的方法见此处

class Task extends TimerTask {

    @Override
    public void run() {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                incOpenTime();
            }
        });
    }
}
于 2011-09-04T21:58:01.860 回答