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

Java 等待指定的时间(不是Thread.sleep()),java,time,wait,Java,Time,Wait,我正在制作一个简单的java游戏,我必须制作一个3..2..1…开始! 我的代码如下: 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));

我正在制作一个简单的java游戏,我必须制作一个3..2..1…开始! 我的代码如下:

    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) { ...

public void paint321(图g){/您在单个GUI线程中睡眠,这会阻止它正确处理各种重要事件。唯一可行的解决方案是使用多线程。

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

ode>Thread.sleep
您正在阻止JFrame/JPanel更新,因为您已经阻止了该线程

对于一个简单的解决方案,您可以使用Java定时器


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

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

对于一个简单的解决方案,您可以使用Java定时器


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

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


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


调用此方法后,你会做什么?@Eugene nothing,我在查看死板字后关闭程序调用此方法后,你会做什么?@Eugene nothing,我在查看死板字后关闭程序我将尝试了解多线程,但我认为奇怪的是,没有简单的方法可以做到这一点,我将尝试了解t多线程,但我认为奇怪的是,没有简单的方法来实现这个非常完整的答案。使用g.drawString(String.valueOf(counter)、wid/2、hei/2)或g.drawString(String.valueOf(counter)、(int)(wid/2)、(int)(hei/2))更正确吗;?是否自动转换?@maxpesa有两个过载用于g.拉丝,一个用于浮子,另一个用于int@AlanFoster像素不是用int表示吗?非常完整的答案。使用g.drawString(String.valueOf(counter)、wid/2、hei/2)或g.drawString(String.valueOf(counter)、(int)(wid/2)、(int)(hei/2))更正确吗;?是否自动转换?@maxpesa有两个过载用于g.拉丝,一个用于浮子,另一个用于int@AlanFoster像素不是表示为int吗?
 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);
}