2008-10-08 59 views
0

我們有一個使用AWT構建的Java Applet。這個小程序可讓您從硬盤選擇圖片並將其上傳到服務器。該小程序包含一個可滾動的圖片列表,在Windows,Linux和Mac OS X 10.5中運行良好。我們通過Java Web Start或網頁啓動這個applet。Java Applet,AWT刷新,Mac OS X 10.4上的問題

無論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等價物替換了所有帶有背景圖像的控件,問題仍然存在。 (另外,我還需要做很多其他的修復來完成一個完整的修改)。任何其他想法?一個簡單的一行代碼,強制全部刷新將是偉大的:)

編輯2:主線程創建面板並啓動X線程。使用觀察者/通知者模式,線程完成並通知主控件,該主控件將面板添加到頁面。這是通過一個EventQueue.invokeLater來完成的,除非我錯了,它應該在正確的線程上運行。即使沒有額外的線程正在運行(如加載期間),滾動時問題仍然最爲嚴重。

回答

1

它看起來像混合輕質(通常是擺動)和重量級(AWT)組件連接在一起。移動到Swing你需要替換每個最後的AWT組件Swing等價物(提示:避免import java.awt。*)。

線程往往是一個奇怪的錯誤潛在的問題。擺動組件必須始終在EDT上使用(使用java.awt.EventQueue.invokeLater)。 AWT是線程安全的理論,但在實踐中並未實現 - 也限制了對EDT的使用。

1

由於您已經需要Java 1.4,所以您應該考慮一些小的更改以使用SWING GUI,它解決了我們的AWT帶來的Applet刷新問題。 (Mac,Linux等)

如果您有面板中,你需要的JPanel等

來代替它,你需要這樣的:

import javax.swing.*;