我正在尝试使用Swing和Java为Web浏览器编写渲染器。可能不是一个好主意,但我决定尝试一下。
现在我来到了一个非常棘手的问题。方案:为了降低CPU消耗(当我在paintComponent
方法中完成所有渲染时,这非常高)我将渲染逻辑移动到另一个函数并开始渲染到BufferedImage
。 paintComponent
现在从此图像中获取数据并将其绘制到屏幕上。
然而,我现在有许多奇怪的错误,我不知道如何解决。
1)我调整了JFrame的大小,一些处理程序由我编写,重新计算位置和大小。但是当它完成后,我看到一个白色的黑屏在我的视口中没有任何内容(我的" root"元素,JPanel的祖先,变成白色,也许是因为那个方案,我不知道。
2)如果在" viewport"之外的某处点击但在JFrame中,一切都OK。但是当我最小化然后恢复帧时 - 视口再次变白。看起来像是一些bug,但为什么只有在完整的框架重绘后才能看到它?
3)块中的文本选择(自定义,由我实现)在"模型"中正常工作,但是在"视图"中显示更改。我再次需要最小化然后恢复帧。我发现没有办法让它立即显示(它是使用JLabels的背景实现的,在我的结构中)。在切换到BufferedImage
之前它工作正常,但现在它也有问题。
所以问题是:我做错了什么以及如何以正确的方式做到这一点? 请不要建议使用一些C / C ++库来操作图形,我想用Java来做。
UPD1:我发现了一个重要的细节。 "消隐"的问题在最小化和恢复之后,仅在3个示例中的一个中可再现。我寻找差异,我想我看到了主要的差异。问题示例具有嵌套的自定义元素(即,从Buffered Image
绘制自身的元素是其他此类元素的成员,因为所有这些元素都扩展了JPanel)。也许这是错误的想法,我应该只在Vector中存储元素,但不要将它们全部放到JPanels中(想想,我需要在屏幕上绘制它们,无论如何,所以我应该扩展一个Swing组件)。
UPD2:我读了here关于系统重绘触发器的内容,但是我仍然无法弄清楚为什么当我移动窗口时,内存中光栅完成的重绘是否正常,部分或甚至用另一个窗口完全隐藏它,但在我最小化然后恢复后失败!怎么可能?...
UPD3:删除了与主题无关的软件包,并将代码作为zip存档上传:http://dropmefiles.com/CLGs7。问题示例是LayoutTests
,它是一个可运行的类。主要类是Drawable
,这是核心。 WebDocument
是一个JFrame的祖先,它在帧大小调整方面做了一些工作,并且还存储了一些有用的属性。
答案 0 :(得分:0)
哦,对不起你的时间,我发现了3个错误中至少有2个的原因。它真的不与Swing相关(虽然它被Swing隐藏,直到我最小化窗口)。我在我的代码中的许多地方都调用了removeAll(),这就是为什么我的所有孩子都被删除的原因。再次抱歉,我只是缺乏关注。