Java小程序,AWT刷新,Mac OS X 10.4上的问题

Java小程序,AWT刷新,Mac OS X 10.4上的问题,java,macos,applet,awt,osx-tiger,Java,Macos,Applet,Awt,Osx Tiger,我们有一个使用AWT构建的Java小程序。此小程序允许您从硬盘中选择图片并将其上载到服务器。小程序包括一个可滚动的图片列表,在Windows、Linux和Mac OS X 10.5中运行良好。我们通过JavaWebStart或在网页中启动这个小程序 无论Java版本是1.4还是1.5,我们的小程序在Mac OS X 10.4中都无法正常运行。滚动时,您可以在此处找到错误行为的屏幕截图: 简单地说,有时滚动图片时会与应用程序的页眉或页脚重叠。这种行为不会发生在其他平台上。在Mac OS X 10

我们有一个使用AWT构建的Java小程序。此小程序允许您从硬盘中选择图片并将其上载到服务器。小程序包括一个可滚动的图片列表,在Windows、Linux和Mac OS X 10.5中运行良好。我们通过JavaWebStart或在网页中启动这个小程序

无论Java版本是1.4还是1.5,我们的小程序在Mac OS X 10.4中都无法正常运行。滚动时,您可以在此处找到错误行为的屏幕截图:

简单地说,有时滚动图片时会与应用程序的页眉或页脚重叠。这种行为不会发生在其他平台上。在Mac OS X 10.4上,它在滚动时在不正确的位置显示图片,如果在该位置绘制图像后刷新屏幕,则不会太糟糕。但是,应用程序似乎并不知道它错误地绘制了它,因此不会刷新

如果窗口被最小化、调整大小甚至移动,应用程序将被刷新,位置不正确的元素将消失,应用程序将正常恢复。我花了相当长的时间试图强制刷新背景图像,但没有成功。(直接重新绘制图像,重新绘制几个面板的所有子级,等等)因此,我正在寻找任何可以帮助我在Mac OS X 10.4下解决此问题的技巧,或者在最坏的情况下,只需模拟完全的小程序刷新

直到最近,一切都与Java1.1兼容,但在一些现在需要1.4的地方,这种情况已经发生了变化。我不认为这些变化造成了问题,我只是提供了额外的信息。如果您对scroll面板的实现细节感兴趣,我将进行调查,但我假设这是一个常见的平台错误,必须知道解决方法

要复制此问题,请打开以下Java Web Start应用程序:

选择一个包含大量图像的文件夹并播放滚动条。在某个时候(相当快),您应该会遇到刷新问题

编辑:我遵循了第一个建议,将所有具有背景图像的控件替换为Swing等效控件,问题仍然存在。(另外,我还需要做许多其他的修复来完成一个完整的更改)。还有其他想法吗?用一行简单的代码强制进行完全刷新就好了:)


Edit2:主线程创建面板并启动X个线程。使用观察者/通知者模式,线程完成并通知主控件,主控件向页面添加一个面板。这是通过EventQueue.invokeLater完成的,除非我弄错了,否则它应该在正确的线程上运行。即使没有额外的线程在运行(如在加载过程中),在滚动时问题也最严重

> P>既然你已经要求java 1.4,你应该考虑一些小的改变来代替Swing GUI,它用AWT解决了我们的小程序刷新问题。(Mac、Linux等)

如果您有例如面板,您需要用JPanel等替换它

你需要这个:

import javax.swing.*;

它看起来确实像是将轻量级(通常是摇摆)和重量级(AWT)组件混合在一起。转到Swing,您需要替换每一个最后的AWT组件Swing等价物(提示:避免导入java.AWT.*)

线程通常是奇怪bug的潜在问题。必须始终在EDT上使用Swing组件(使用
java.awt.EventQueue.invokeLater
)。AWT是线程安全的,这是理论上的,但不是实践上的,这也限制了EDT的使用