Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用Swing动画计时_Java_Swing_Animation_Timer - Fatal编程技术网

Java 使用Swing动画计时

Java 使用Swing动画计时,java,swing,animation,timer,Java,Swing,Animation,Timer,我在摇摆和设置角色动画方面有一些问题, 我有一个带有键侦听器的JFrame,当用户按下时,它在这里调用我的JPanel方法 for(int i=1;i<4;i++) { pY+=16; g.drawImage(perso,pX,pY,pX+50,pY+50,0+50*i,0,50+50*i,50,this this.repaint(); } 对于(int i=1;i您可以使用摆动计时器并定期更新动画。请参阅

我在摇摆和设置角色动画方面有一些问题, 我有一个带有键侦听器的JFrame,当用户按下时,它在这里调用我的JPanel方法

for(int i=1;i<4;i++)
{           
    pY+=16;
    g.drawImage(perso,pX,pY,pX+50,pY+50,0+50*i,0,50+50*i,50,this 
    this.repaint();                 
}

对于(int i=1;i您可以使用摆动计时器并定期更新动画。请参阅

  • 不要扩展
    JFrame
    ,创建
    JFrame
    作为局部变量

  • 不要使用
    keylister
    ,而是使用
    KeyBindings

  • 不要直接绘制到
    JFrame
    ,使用
    drawImage()
    绘制到
    JLabel
    JComponent/JPanel

  • 这动画我的角色,但如此之快,我们可以看到一个东西,我怎么做,以查看动画


  • 另一个关于
    KeyListener
    的问题是,您必须设置两个
    KeyEvents

    之间的延迟。Jonas已经给出了答案(使用摆动计时器),但是解释为什么您没有看到动画,以及为什么计时器是解决此问题的最佳解决方案,可能会很有用

    为什么我看不到不同的重新绘制

    调用
    JComponent#repaint
    时,不会重新绘制
    JComponent
    。相反,在EDT上会安排一个异步请求来重新绘制某个组件。如果调用多个
    repaint
    调用,Swing可能会决定对这些请求进行分组,并只重新绘制一次组件

    我没有立即在Oracle文档中找到这方面的官方参考(似乎没有提及)。我唯一发现这一点的地方是在中的一个注释中,但我非常确定这是在某个地方记录的

    为什么使用
    计时器
    是最佳解决方案

    对于动画,您基本上希望说:

    我的角色应该在
    y
    毫秒内移动
    x
    像素

    最好是,你们希望在屏幕上有一个平滑的动画,所以你们需要经常重新绘制

    • 与Swing组件的所有交互都应该在EDT上进行(事件调度线程,有关更多信息,请参阅文章)
    • 您不应该阻止EDT,因为这将冻结您的UI,这意味着您不能在EDT中“等待”,直到重新绘制完成,否则重新绘制将永远不会发生
    • 重新绘制请求可以分组,因此调用Repaint
      x
      times不能保证您的
      paint
      方法也被调用
      x
      times
    克服此限制的解决方案是使用
    定时器
    。在相同的示例中(在屏幕上移动字符),您可以使用
    定时器
    更新字符的位置并计划重新绘制。由于
    定时器
    代码是在EDT上触发的,因此您不会违反Swing线程规则

    在组件的
    paintComponent
    方法中,然后在当前位置绘制角色。这可能是“前一位置+1”或“前一位置+2”(或…)取决于在上一次
    绘制
    调用和当前的
    绘制
    调用之间触发
    计时器
    的次数。这可确保角色移动的速度与系统无关。只有动画的平滑度取决于您的系统(如:有多少重新绘制请求被分组)


    Jonas已经链接到的包含更多信息。

    感谢您提供的详细信息,这对我非常有用,我将尝试使用计时器then@mKorbel谢谢。不幸的是,它似乎没有得到很多选票:-(