Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/346.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/7.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_Repaint - Fatal编程技术网

Java Swing中的平滑动画

Java Swing中的平滑动画,java,swing,animation,repaint,Java,Swing,Animation,Repaint,如何以客户端监视器的最大刷新率设置JPanel的动画 我希望发生的是,paintComponent仅在上次更新后调用。我可以通过使用计时器来安排每隔(1000/60)毫秒重新绘制一次(),但我只是猜测刷新率是多少 实际上,我希望连续调用重新绘制。但是,如果我每秒调用repaint200次,而EDT不忙,它每秒执行paintComponent200次,这对处理器时间的使用效率很低,可能会对应用程序的其余性能产生不利影响。我不确定以监视器的刷新率重新绘制是一个好主意。但是如果你想知道刷新率是多少,你

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

我希望发生的是,
paintComponent
仅在上次更新后调用。我可以通过使用
计时器来安排
每隔(1000/60)毫秒重新绘制一次(
),但我只是猜测刷新率是多少


实际上,我希望连续调用
重新绘制
。但是,如果我每秒调用
repaint
200次,而EDT不忙,它每秒执行
paintComponent
200次,这对处理器时间的使用效率很低,可能会对应用程序的其余性能产生不利影响。

我不确定以监视器的刷新率重新绘制是一个好主意。但是如果你想知道刷新率是多少,你可以使用这段代码(无耻地从互联网上复制)

GraphicsEnvironment ge=GraphicsEnvironment
.getLocalGraphicsEnvironment();
GraphicsDevice[]gs=ge.getScreenDevices();
对于(int i=0;i
我同意
@little bunny foo foo
并且你也必须用操作系统延迟来计算,这个值取决于硬件和软件,那么我的WinXp的值大约是63毫秒,通过过度锁定这个频率,你会从RepaintManager得到错误,例如JTable是非常敏感的JComponents,请阅读更多关于Swing中绘画的内容,repaint()通过defalut创建EDT


编辑:消除所有可能对重新绘制()的疑虑;请看此处

这可能与主题无关,但会将多个请求折叠为组件树成员的单个重绘。是否确实要多次重绘()?在JPanel中的对象会有这么大的变化吗?或者你正在考虑将其动画化,就像在其中移动一个图像一样,就像一个游戏?你不知道什么时候你真的需要重新绘制吗?@woliveirajr是的,我在考虑一个游戏@我没有那本书@感觉不需要重新油漆是可能的,但可能性不大;但是我不想安排不必要的时间repaints@Luigi当前位置我现在有点忙,所以我不能做研究来帮助你。但是试着寻找更多关于精灵、动画甚至java游戏的信息。我几乎可以肯定,放置新对象(或更改其属性)并重新绘制将是正确的方法。也许我真正想要做的是以刷新率重新计算动画的位置,而不是重新绘制本身,并在必要时触发重新绘制。我想这会很好。如果精灵的数量非常复杂,则可以以最合适的fps刷新。我建议使用双缓冲来尽可能平滑动画。我很确定所有Swing在默认情况下都是双缓冲的days@Luigi-你说得对,默认情况下是打开的。谢谢你的更正。
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);
    }
}