如何解决Java Swing paintImmediately() 方法适用于主线程而不是 EDT 线程
我正在编写一个程序,它应该为每一帧更新和渲染动画。我有一个 AnimationPanel
类,它扩展了 JPanel
和一个 Animation
类,它用无限循环维护我的动画。我正在通过 JPanel 的 paintComponent
方法从 paintImmediately
(animation
对象)调用 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*/)
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 举报,一经查实,本站将立刻删除。