微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Java Swing paintImmediately() 方法适用于主线程而不是 EDT 线程

如何解决Java Swing paintImmediately() 方法适用于主线程而不是 EDT 线程

我正在编写一个程序,它应该为每一帧更新和渲染动画。我有一个 AnimationPanel 类,它扩展了 JPanel一个 Animation 类,它用无限循环维护我的动画。我正在通过 JPanel 的 paintComponent 方法paintImmediatelyanimation 对象)调用 Animation 方法,并且一切都运行良好,直到我向 JFrame 添加一个新组件。然后,组件开始相互重叠,因为新组件正在 EDT 线程上工作,但我的 animation 正在主线程上工作,不知何故它在调用 paintImmediately 然后 paintComponent 也在主线程中,但当然不应该。我尝试将代码paintImmediately 部分放到 EDT 线程中并且它起作用了,但是性能确实很差(而不是 >100fps,只有 ~40fps)并且动画开始滞后,并且表现得与原来相同repaint() 方法代替。所以我想我做错了什么,但我完全不知道是什么。
paintComponent 方法如下所示:

@Override
protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    animation.render(g2d);
}

render 方法如下所示:

public void render(Graphics2D g2d) {
    objects.forEach((o) -> o.render(g2d));
}

每个对象都有自己的render方法,通常是g2d.fill(/*object's shape*/)

循环调用render()方法

private void render() {
    //It calls paintComponent in the main thread
    panel.paintImmediately(0,panel.getWidth(),panel.getHeight());
}

及其滞后的修改

private void render() {
    //It calls paintComponent int the EDT thread
    SwingUtilities.invokeAndWait(()->panel.paintImmediately(0,panel.getHeight()));
}

感谢您的帮助!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?