我们有一个使用AWT构建的Java Applet。此小程序允许您从硬盘驱动器中选择图片并将其上传到服务器。该applet包含一个可滚动的图片列表,可在Windows,Linux和Mac OS X 10.5中正常运行。我们通过Java Web Start或网页启动此applet。
无论Java版本(1.4或1.5)如何,我们的applet在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完成的,除非我弄错了,否则应该在正确的线程上运行。即使没有额外的线程正在运行(如加载期间),滚动时问题也是最严重的。
答案 0 :(得分:1)
由于您已经需要Java 1.4,您应该考虑使用SWING GUI进行一些小的更改,它解决了我们使用AWT的Applet刷新问题。 (Mac,Linux等)
如果您有例如面板,你需要用JPanel等替换它。
你需要这个:
import javax.swing.*;
答案 1 :(得分:1)
看起来确实将轻量级(通常为Swing)和重量级(AWT)组件混合在一起。移动到Swing你需要替换每个最后的AWT组件Swing等价物(提示:避免导入java.awt。*)。
线程通常是奇怪错误的潜在问题。必须始终在EDT上使用Swing组件(使用java.awt.EventQueue.invokeLater
)。 AWT是线程安全的理论,但在实践中不是 - 也限制了对EDT的使用。