当前位置: 首页 > 面试题库 >

Thread.sleep()停止绘画?

微生毅然
2023-03-14
问题内容

我正在制作一个程序,试图对在屏幕上移动的卡片进行动画处理,就好像您实际上是从桌子上拔出它一样。这是动画的代码:

public void move(int x, int y) {
    int curX = this.x; //the entire class extends rectangle
    int curY = this.y;

    // animate the movement to place
    for (int i = curX; i > x; i--) {
        this.x = i;
    }

    this.x = x;
    this.y = y;
}

此矩形对象位于jframe内的面板内。为了重新粉刷面板,我有这个:

public void run() {
    while (Core.isRunning()) {
        gamePanel.repaint(); //panel in which my rectangle object is in

        try {
            Thread.sleep(50);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

这是一个线程,每隔50毫秒重新绘制一次gamePanel。

现在,我意识到这可能不是执行此类操作的最佳方法。如果有更好的方法来完成整个重新粉刷工作,请通知我!

但是,我遇到的问题是,当我move()为矩形调用命令时,它会通过线程,但是图像不会更新到最后,因此只是从点a到最终位置的跳转。

为什么会这样呢?任何人都可以批评/改善我的代码吗?谢谢!


问题答案:

问题是您Thread.sleep()在事件调度线程中调用导致GUI变得无响应。为了避免这种情况,您可能需要改用Swing
Timer

   Timer timer = new Timer(50, new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            if(!stop) {
                gamePanel.repaint();
            } else {
                ((Timer)e.getSource()).stop();
            }
        }
    });
    timer.setRepeats(true);
    timer.setDelay(50);
    timer.start();

哪里stop是指示动画必须停止一个布尔标志。



 类似资料:
  • 问题内容: 使用Thread.sleep()时,JTextField.setText()出现问题。这是我正在制作的基本计算器。当输入字段中的输入格式不正确时,我希望“输入错误”出现在输出字段中5秒钟,然后将其清除。当我将文本一次设置为“INPUT ERROR”(输入错误)时,setText()方法_确实_起作用,并且通过打印之间的文本,我发现它确实可以与setText(“”)一起使用。当我将Thr

  • 问题内容: 我想停止处理程序中的此间隔重复运行。那有可能吗? 问题答案: 您需要在点击处理程序范围内将的返回值设置为变量,然后像这样使用:

  • 1.若要暂停训练,请按下该按钮。显示暂停。若要继续训练,请点击绿色箭头图标。 2.若要停止训练,在记录训练期间或处于暂停模式时长按该按钮三秒钟,直至计数器清零。或者您可以点击并按住显示屏上的红色停止按钮。 如果在暂停后停止训练,则暂停后经过的时间不包括在总训练时间内。

  • 若要暂停训练 长按正面按钮 或 在训练视图中向右滑动,找出并轻触暂停图标。 通过向左滑动您可以在暂停模式中看到训练总结。 恢复暂停的训练 轻触绿色箭头图标。 停止训练 在训练期间或在暂停模式中,长按正面按钮直至绿色计时器一直倒数。 或 在暂停模式中,轻触并按住红色停止图标可结束记录。

  • 1.若要暂停训练,请按“返回”按钮。显示“记录已暂停”。若要继续训练,请按“开始”。 2.若要停止训练,在训练记录或处于暂停模式时长按“返回”按钮三秒钟,直到显示“记录已结束”。 如果在暂停后停止训练,则暂停后经过的时间不包括在总训练时间内。

  • 问题内容: 我开始学习一些用于数据分析的python(使用R)。我正在尝试使用创建两个图,但它始终将第二个保存在第一个上。如何停止这种行为? 问题答案: 为此,您必须开始一个新的图形。假设您有,有多种方法可以做到这一点。也摆脱它,您可以从那里使用。 方法1 采用 方法2 每个人之前致电