Java Thread.sleep()不工作

Java Thread.sleep()不工作,java,thread-sleep,Java,Thread Sleep,在java中尝试使游戏角色跳跃时,我尝试使用Thread.sleep()使图像向上移动5像素,然后等待100毫秒,然后再次向上移动5像素,等等 相反,当图像需要每5像素向上5步,每次等待100毫秒时,它会等待500毫秒,然后向上移动25像素 我无法解释这种行为,网上似乎也没有答案。请注意,我的程序不包含线程。这是我的密码: ImageIcon poppetje1 = new ImageIcon("img/poppetje1.jpg"); JLabel poppetje2

在java中尝试使游戏角色跳跃时,我尝试使用Thread.sleep()使图像向上移动5像素,然后等待100毫秒,然后再次向上移动5像素,等等

相反,当图像需要每5像素向上5步,每次等待100毫秒时,它会等待500毫秒,然后向上移动25像素

我无法解释这种行为,网上似乎也没有答案。请注意,我的程序不包含线程。这是我的密码:

ImageIcon poppetje1         = new ImageIcon("img/poppetje1.jpg");
JLabel    poppetje2         = new JLabel(poppetje1);

...

public void jump() {
    try {
        poppetje2.setBounds(poppetje2.getX(), (poppetje2.getY()-5), poppetje1.getIconWidth(), poppetje1.getIconHeight());
        Thread.sleep(100);
    } catch(InterruptedException e) {
        e.printStackTrace();
    }
}

...

public void keyPressed(KeyEvent e) {
    if(e.getKeyCode() == KeyEvent.VK_W) {
        for(int c = 0; c < 10; c++) {
            jump();
            repaint();
        }
    }
}
ImageIcon-poppetje1=新的ImageIcon(“img/poppetje1.jpg”);
JLabel poppetje2=新JLabel(poppetje1);
...
公共跳转{
试一试{
poppetje2.setBounds(poppetje2.getX(),(poppetje2.getY()-5),poppetje1.getIconWidth(),poppetje1.getIconHeight());
睡眠(100);
}捕捉(中断异常e){
e、 printStackTrace();
}
}
...
按下公共无效键(按键事件e){
if(e.getKeyCode()==KeyEvent.VK_W){
对于(int c=0;c<10;c++){
跳跃();
重新油漆();
}
}
}
我希望这是足够的我的代码,如果我应该上传完整的代码,请询问


提前感谢您的时间。

也许您在这行代码中遇到了异常
poppetje2.setBounds(poppetje2.getX(),(poppetje2.getY()-5),poppetje1.getIconWidth(),poppetje1.getIconHeight())并且它直接跳转到catch语句。

setBounds
是否包含重画/渲染步骤?如果没有,在
按键
内阻塞可能会阻止重画发生,直到睡眠全部完成并且
按键
返回。

如果您正在进行此类编程,我建议查看“游戏循环”。使用此模式时,您不必像这样睡觉。您睡在事件调度程序线程上,这不好,因为它会使您的用户界面无响应,并且可能不会执行您想要的操作。您可以使用某种计时器(例如,java.swing.timer)。正如David Ehrmann所建议的,您最好研究游戏循环或使用Java框架进行游戏,如libgdx或Slick2D。谢谢大家,我使用Java.swing.Timer解决了这个问题,程序现在运行顺利:)那么我的错误日志中不应该有错误吗?代码运行时没有错误,只是不像预期的那样。
setBounds
不会重新绘制,在raw中调用它X次与使用最新值调用它一次是一样的。这正是发生的事情。