等待指定的时间java(不是Thread.sleep())

时间:2014-04-17 13:07:42

标签: java time wait

我正在制作一个简单的java游戏,我必须制作一个3..2..1 ... Go! 我的代码是这样的:

    public void paint321(Graphics g) { // <-- called from paintComponent(Graphics)
    try { 
    int hei = this.getHeight(), wid = this.getWidth();
    g.drawString("3", (int)(wid/2), (int)(hei/2));
    Thread.sleep(1000);
    g.drawString("2", (int)(wid/2), (int)(hei/2));
    Thread.sleep(1000);
    g.drawString("1", (int)(wid/2), (int)(hei/2));
    Thread.sleep(1000);
    g.drawString("Go!", (int)(wid/2)-6, (int)(hei/2));
    }
    catch (InterruptedException ex) { ...

但游戏GamePanel(我的面板扩展JPanel并且在JFrame上)看起来是白色3秒,然后我看到&#34; 3&#34;,&#34; 2&#34;,&#34; 1&#34;和&#34;去!&#34;相互粘在一起。

我无法使用线程,但我认为这是因为我告诉计算机甚至不显示当前线程(我的GamePanel,我猜)。

我的问题是:如何在没有Thread.sleep()的情况下等待一段时间(在我的情况下为1秒)? 或者给我一个解释为什么我看到一个白色面板

3 个答案:

答案 0 :(得分:2)

当您使用Thread.sleep时,您阻止JFrame / JPanel更新,因为您已阻止该线程。

对于一个简单的解决方案,您可以使用Java Timer。

如果您正在使用游戏循环机制 - 如果您正在制作游戏,那么您很可能会使用它。您可以简单地跟踪开始时间并绘制初始数字,如果从那时起经过1秒,则绘制下一个数字。

答案 1 :(得分:2)

您应该使用 java.util.Timer (或 javax.swing.Timer ):

 public void paint321(Graphics g) { 
    int hei = this.getHeight(), wid = this.getWidth();

    java.util.Timer timer = new java.util.Timer();
    timer.schedule(new TimerTask() {
         private int counter = 3;

        @Override
        public void run() {               
            if (counter > 0) {
                g.drawString(String.valueOf(counter), wid / 2, hei / 2);
            } else {
                g.drawString("Via!", wid / 2 - 6, hei / 2);
                timer.cancel();
            }

            counter--;
        }
    }, 0L, 1000L);
}

答案 2 :(得分:0)

您在单个GUI线程中睡眠,这会阻止它正确处理各种重要事件。唯一可行的解​​决方案是进行多线程处理。

相关问题