繁体   English   中英

Java Applet,AWT Refresh,在Mac OS X 10.4上发行

[英]Java Applet, AWT Refresh, issue on Mac OS X 10.4

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

不管Java的版本(1.4或1.5)如何,我们的applet在Mac OS X 10.4中均无法正常运行。 滚动时,您可以在此处找到错误行为的屏幕截图:

http://www.lavablast.com/tmp/ui_error.png

简而言之,有时在滚动图片时最终会与应用程序的页眉或页脚重叠。 在其他平台上不会发生此行为。 在Mac OS X 10.4上,它在滚动时将图片显示在错误的位置,如果在该位置绘制完图像后刷新屏幕,效果还不错。 但是,似乎该应用程序不知道它绘制的错误,因此不会刷新。

如果将窗口最小化,调整大小甚至移动,则将刷新应用程序,并且错误放置的元素将消失,并且应用程序将正常恢复。 我花了很多时间尝试不成功地刷新背景图像。 (直接重新绘制图像,重新绘制几个面板的所有子对象,等等。)因此,我正在寻找可以帮助我在Mac OS X 10.4下解决此问题的任何技巧,或者在最坏的情况下,只需模拟一个完整的applet刷新。

直到最近,所有内容都与Java 1.1兼容,但这在某些需要1.4的地方有所改变。 我觉得这些变化不会引起问题,我只是提供这些作为附加信息。 如果您对滚动面板的实现细节感兴趣,我将进行调查,但是我假设这是一个常见的平台错误,因此必须知道解决方法。

要复制该问题,请打开以下Java Web Start应用程序: http : //www.lavablast.com/tmp/opal-webstart.php.jnlp

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

编辑:我遵循这里的第一个建议,并用等效的Swing替换了所有带有背景图像的控件,但问题仍然存在。 (此外,我还需要做许多其他修复才能进行完整的更改)。 还有其他想法吗? 强制完全刷新的简单代码行会很棒:)

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

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

如果您有例如Panel,则需要用JPanel等替换它。

你需要这个:

import javax.swing.*;

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

线程化通常是奇数个bug的潜在问题。 Swing组件必须始终在EDT上使用(使用java.awt.EventQueue.invokeLater )。 AWT从理论上讲是线程安全的,但实际上却不是-还将使用限制为EDT。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM