0

我们有一个使用 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 完成的,除非我弄错了,否则它应该在正确的线程上运行。即使没有额外的线程正在运行(如在加载期间),滚动时问题也最为严重。

4

2 回答 2

1

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

如果您有例如 Panel,则需要将其替换为 JPanel 等。

你需要这个:

import javax.swing.*;
于 2008-10-09T11:42:20.140 回答
1

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

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

于 2008-10-13T22:19:01.337 回答