如何设置 JFrame 的刷新率?

Wil*_*ill 1 java jframe

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

为了绘制,我重写了 PaintComponent() 方法,因此我真正需要做的就是每 40 毫秒重新绘制该组件(同样,它只是一个 Graphic)。

如何设置 25FPS 的 JFrame?

Sni*_*las 6

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

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

你的标题有误导性,你做的是对的。

\n\n
    \n
  • 在你的 JFrame 中创建一个 runner 类
  • \n
\n\n
\n\n
/** Thread running the animation. */\nprivate class Runner extends Thread\n{\n    /** Wether or not thread should stop. */\n    private boolean shouldStop = false;\n    /** Pause or resume. */\n    private boolean pause = false;\n\n    /** Invoke to stop animation. */\n    public void shouldStop() {\n        this.shouldStop = true;\n    }//met\n\n    /** Invoke to pause. */\n    public void pauseGame() { pause = true; }//met\n    /** Invoke to resume. */\n    public void resumeGame() { pause = false; }//met\n\n    /** Main runner method : sleeps and invokes engine.play().\n     * @see Engine#play */\n    public void run()\n    {\n        while( !shouldStop )\n        {\n            try {\n                Thread.sleep( 6 );\n            } catch (InterruptedException e) {\n                // TODO Auto-generated catch block\n                e.printStackTrace();\n            }//catch\n            if( !pause )\n            {\n                engine.play();\n                                    gamePane.repaint();\n\n            }//if\n        }//while\n    }//met\n\n    /** Wether or not we are paused. */\n    public boolean isPaused() {\n        return pause;\n    }//met\n}//class Runner (inner)\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

问候,\n St\xc3\xa9phane

\n