2008-10-08 62 views
0

我们有一个使用AWT构建的Java Applet。这个小程序可让您从硬盘选择图片并将其上传到服务器。该小程序包含一个可滚动的图片列表,在Windows,Linux和Mac OS X 10.5中运行良好。我们通过Java Web Start或网页启动这个applet。Java Applet,AWT刷新,Mac OS X 10.4上的问题

无论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等价物替换了所有带有背景图像的控件,问题仍然存在。 (另外,我还需要做很多其他的修复来完成一个完整的修改)。任何其他想法?一个简单的一行代码,强制全部刷新将是伟大的:)

编辑2:主线程创建面板并启动X线程。使用观察者/通知者模式,线程完成并通知主控件,该主控件将面板添加到页面。这是通过一个EventQueue.invokeLater来完成的,除非我错了,它应该在正确的线程上运行。即使没有额外的线程正在运行(如加载期间),滚动时问题仍然最为严重。

回答

1

它看起来像混合轻质(通常是摆动)和重量级(AWT)组件连接在一起。移动到Swing你需要替换每个最后的AWT组件Swing等价物(提示:避免import java.awt。*)。

线程往往是一个奇怪的错误潜在的问题。摆动组件必须始终在EDT上使用(使用java.awt.EventQueue.invokeLater)。 AWT是线程安全的理论,但在实践中并未实现 - 也限制了对EDT的使用。

1

由于您已经需要Java 1.4,所以您应该考虑一些小的更改以使用SWING GUI,它解决了我们的AWT带来的Applet刷新问题。 (Mac,Linux等)

如果您有面板中,你需要的JPanel等

来代替它,你需要这样的:

import javax.swing.*;