【问题标题】:Wait for a specified time java (not Thread.sleep( ))等待指定时间java(不是Thread.sleep())
【发布时间】:2014-04-17 13:07:41
【问题描述】:

我正在做一个简单的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 秒,然后我看到“3”、“2”、“1”和“Go!”互相卡住。

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

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

【问题讨论】:

  • 调用这个方法后你会做什么?
  • @Eugene 没什么,我在查看卡住的文字后关闭程序

标签: java time wait


【解决方案1】:

您应该使用 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);
}

【讨论】:

  • 非常完整的答案。使用是否更正确:g.drawString(String.valueOf(counter), wid / 2, hei / 2);或 g.drawString(String.valueOf(counter), (int)(wid / 2), (int)(hei / 2)); ?投射是自动的吗?
  • @maxpesa 为 g.drawString 提供了两个重载,一个用于 float,一个用于 int
  • @AlanFoster 像素不表示为 int 吗?
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 我会尝试学习多线程,但我觉得奇怪的是没有简单的方法来做到这一点
    猜你喜欢
    • 2021-03-25
    • 1970-01-01
    • 2021-04-05
    • 1970-01-01
    • 2013-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-09
    相关资源
    最近更新 更多