Swing中的平滑动画

时间:2011-07-15 12:48:03

标签: java swing animation repaint

如何以客户端监视器的最大刷新率为JPanel设置动画?

我希望发生的是paintComponent仅在上次更新后调用。我可以通过使用Timer每隔(1000/60)ms安排repaint()来做到这一点,但我只是猜测刷新率是多少。

实际上,我希望repaint能够被连续调用。但是,如果我每秒调用repaint 200次并且EDT不忙,则每秒执行paintComponent 200次,这对处理器时间的使用效率低,并且可能会对应用程序的其余性能产生负面影响

2 个答案:

答案 0 :(得分:2)

我不确定重新调整显示器的刷新率是一个好主意。但是如果你想找出刷新率是什么,你可以使用这段代码(从互联网上无耻地复制)。

GraphicsEnvironment ge = GraphicsEnvironment
        .getLocalGraphicsEnvironment();
GraphicsDevice[] gs = ge.getScreenDevices();

for (int i = 0; i < gs.length; i++) {
    DisplayMode dm = gs[i].getDisplayMode();

    // Get refresh rate in Hz
    int refreshRate = dm.getRefreshRate();
    if (refreshRate == DisplayMode.REFRESH_RATE_UNKNOWN) {
        // Unknown rate
    } else {
        System.out.println(refreshRate);
    }
}

答案 1 :(得分:1)

我同意@little bunny foo foo你必须用OS Latency计算,这个值取决于HW&amp; SW,然后我的WinXp的值大约为63ms,通过锁定此频率,您从RepaintManager获得错误,例如JTable是非常敏感的JComponents,请阅读有关Swing paintImmediately()中的绘画的更多信息,重绘()通过defalut创建EDT

编辑:吹走所有关于重绘()的疑虑;看这里painting and javax.swing.Timer