【问题标题】:How do I set up a JFrame with a refresh rate?如何设置具有刷新率的 JFrame?
【发布时间】:2011-09-09 18:50:02
【问题描述】:

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

为了绘制,我重写了 paintComponent() 方法,所以我真正需要做的就是每 40 毫秒重新绘制一次组件(同样,它只是一个图形)。

如何设置 25FPS 的 JFrame?

【问题讨论】:

  • 我猜你不想用 25 fps 更新 JFrame,但它的一些内容。你使用Java3D吗?你使用 OpenGL 吗?你的显示面板的父类是什么(jpanel、widget、...)?
  • 有点宽泛的问题,如上所述,我认为无法回答。
  • @Hovercraft Full of Eels:现在应该足够具体了。告诉我是否需要更多详细信息。

标签: java jframe


【解决方案1】:

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

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

您的标题具有误导性,您做对了。

  • 在您的 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 的其他部分。

问候, 斯蒂芬

【讨论】:

    【解决方案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();
    }
    

    【讨论】:

    • 这只是添加到 public static void main 方法的末尾?
    • @Will:是的,只要您在event dispatch thread 上,通常在setVisible() 之后。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多