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

标签 java macos applet awt osx-tiger

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

最佳答案

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

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

关于Java Applet、AWT 刷新、Mac OS X 10.4 上的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/184491/

相关文章:

linux - echo 3 >/proc/sys/vm/drop_caches 在 Mac OSX 上

macos - 让 Mac 信任应用程序(登录窗口上的协同作用)

c - mac上有C的图形库吗?

Java Applet - ArrayIndexOutOfBoundsException(第 2 部分)

java - 包含小程序的规范方式

java - 在 txt 文件上写入文本及其方法

java - 行数据库和列数据库在处理信息检索方面的区别

java - 与 JUnit 一起运行时,Intellij IDEA 不会在 Kotlin 断点处停止

java - 无法将 Excel 文件中的日期值放入 Web 申请表中

java - 是否可以为 Java Applet 制作 JAR 文件?