如何设置刷新率的JFrame?

时间:2011-06-07 04:56:19

标签: java jframe

我有一个2D游戏,整个结构完全编码,除了图形。我只是更新JFrame的单个组件,它是一个包含50个图像的Graphic。每帧图像都在不同的位置,因此需要刷新率。

要绘制,我已经覆盖了paintComponent()方法,所以我真正需要做的就是每40ms重新绘制一个组件(再次,只是一个Graphic)。

如何设置25FPS的JFrame?

2 个答案:

答案 0 :(得分:4)

刷新JFrame是个坏主意。它是Swing中为数不多的重要组件之一。最好的方法是

  • 识别包含动画的面板
  • 创建一个扩展JPanel的类。即GamePane扩展JPanel
  • 覆盖paintComponent(没有s)

你的头衔是误导性的,你做对了。

  • 在你的JFrame中创建一个跑步者类

/** Thread running the animation. */
private class Runner extends Thread
{
    /** Wether or not thread should stop. */
    private boolean shouldStop = false;
    /** Pause or resume. */
    private boolean pause = false;

    /** Invoke to stop animation. */
    public void shouldStop() {
        this.shouldStop = true;
    }//met

    /** Invoke to pause. */
    public void pauseGame() { pause = true; }//met
    /** Invoke to resume. */
    public void resumeGame() { pause = false; }//met

    /** Main runner method : sleeps and invokes engine.play().
     * @see Engine#play */
    public void run()
    {
        while( !shouldStop )
        {
            try {
                Thread.sleep( 6 );
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }//catch
            if( !pause )
            {
                engine.play();
                                    gamePane.repaint();

            }//if
        }//while
    }//met

    /** Wether or not we are paused. */
    public boolean isPaused() {
        return pause;
    }//met
}//class Runner (inner)

你的动画会更顺畅。并使用MVC和事件来刷新UI的其他部分。

此致  斯特凡

答案 1 :(得分:2)

AnimationTest使用javax.swing.Timer。 40 ms的周期将给出25 Hz的速率。

private final Timer timer = new Timer(40, this);

附录:计时器的ActionListener通过调用repaint()进行响应,随后调用被覆盖的paintComponent()方法

@Override
public void actionPerformed(ActionEvent e) {
    this.repaint();
}