【问题标题】:Java Applet, AWT Refresh, issue on Mac OS X 10.4Java Applet、AWT Refresh、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 完成的,除非我弄错了,否则它应该在正确的线程上运行。即使没有额外的线程正在运行(如在加载期间),滚动时问题也最为严重。

【问题讨论】:

    标签: java macos applet awt osx-tiger


    【解决方案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.*;
      

      【讨论】:

        猜你喜欢
        • 2013-03-16
        • 2010-09-22
        • 2010-09-23
        • 2010-11-08
        • 2011-07-14
        • 2023-03-12
        • 2012-08-15
        • 2016-09-26
        • 1970-01-01
        相关资源
        最近更新 更多