我们有一个使用 AWT 构建的 Java Applet。此小程序可让您从硬盘驱动器中选择图片并将它们上传到服务器。该小程序包含一个可滚动的图片列表,可在 Windows、Linux 和 Mac OS X 10.5 中正常运行。我们通过 Java Web Start 或在网页中启动这个小程序。
无论 Java 版本如何(1.4 或 1.5),我们的小程序在 Mac OS X 10.4 中都无法正常运行。您可以在此处找到滚动时错误行为的屏幕截图:
http://www.lavablast.com/tmp/ui_error.png
简而言之,有时当滚动图片时,最终会与应用程序的页眉或页脚重叠。此行为在其他平台上不会发生。在 Mac OS X 10.4 上,它在滚动时会在错误的位置显示图片,如果在该位置绘制图像后刷新屏幕,这不会那么糟糕。但是,应用程序似乎并不知道它绘制不正确,因此不会刷新。
如果窗口被最小化、调整大小甚至移动,应用程序会被刷新,错误定位的元素会消失,应用程序会正常恢复。我花了很长时间试图强制刷新背景图像,但没有成功。(直接重新绘制图像,重新绘制几个面板的所有子项等。)因此,我正在寻找任何可以帮助我在 Mac OS X 10.4 下解决此问题的提示,或者在最坏的情况下,只是模拟一个完整的小程序刷新。
直到最近,一切都与 Java 1.1 兼容,但这在一些地方发生了变化,现在需要 1.4。我不认为这些更改造成了问题,我只是将其作为额外信息提供。如果您对滚动面板的实现细节感兴趣,我会进行调查,但我假设这是一个常见的平台错误,必须知道解决方法。
要重现该问题,请打开以下 Java Web Start 应用程序: http ://www.lavablast.com/tmp/opal-webstart.php.jnlp
选择一个包含大量图像的文件夹并使用滚动条进行播放。在某个时候(相当快),您应该会遇到刷新问题。
编辑:我在这里遵循了第一个建议,并将所有具有背景图像的控件替换为 Swing 等效项,但问题仍然存在。(另外,我还需要做许多其他的修复来进行彻底的改变)。还有其他想法吗?强制完全刷新的简单的一行代码会很棒:)
Edit2:主线程创建面板并启动 X 线程。使用观察者/通知者模式,线程完成并通知主控件,主控件将面板添加到页面。这是通过 EventQueue.invokeLater 完成的,除非我弄错了,否则它应该在正确的线程上运行。即使没有额外的线程正在运行(如在加载期间),滚动时问题也最为严重。