Java Applet、AWT Refresh、Mac OS X 10.4 上的问题

Posted

技术标签:

【中文标题】Java Applet、AWT Refresh、Mac OS X 10.4 上的问题【英文标题】:Java Applet, AWT Refresh, issue on Mac OS X 10.4 【发布时间】:2010-09-16 02:48:32 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

【参考方案2】:

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

如果你有例如Panel,需要换成JPanel等。

你需要这个:

import javax.swing.*;

【讨论】:

以上是关于Java Applet、AWT Refresh、Mac OS X 10.4 上的问题的主要内容,如果未能解决你的问题,请参考以下文章

java awt;java applet;java swing分别是啥?他们之间有啥联系和区别?

java中applet中的drawimage怎么用

java.awt

Java API 各个包的内容解释

Java applet 井字游戏——怎样重新开始?(留问题)

java中applet的问题,谢谢指教啊!!!总是启动:未初始化小程序