2014-02-10 88 views
3

我有一個Swing應用程序,帶有某種重繪問題。當屏幕(JFrame)被關閉時,來自該屏幕的人爲痕跡有時被繪製在其他屏幕上。在我們的辦公室的100多臺開發人員機器以及使用該軟件的成千上萬的用戶中,絕大多數是不可複製的。過去幾年來,這個問題已經有零星報道,但我們一直都在指責顯卡或驅動程序。儘管如此,在過去的幾個月裏,這個問題的報道數量急劇上升,因此我們需要找出真正的原因。Java Swing屏幕文物

幾乎我們所有的客戶端都運行在Windows上,它同時影響Windows 7和8機器。我們通常在JRE 1.6.0_29上運行,但該問題也發生在1.6.0_45和1.7.0_51上。

下面的圖片說明了這個問題。我用紅色標出了神器 - 這是另一個已關閉的JFrame的一部分。當JFrame可見時,它不在屏幕上的那個位置。還要注意,工件之上的JTable的列不符合要求。最後,請注意,工件不是繪製在JTable上方,而是繪製在其父級JScrollPane和位於屏幕底部的單獨JPanel上。

有人有什麼想法可能會導致此?

enter image description here

+1

發生什麼情況,當您調整剩餘窗口大小時,觸發重繪?此外,工件組件是否可點擊或以任何方式響應用戶交互? – LuigiEdlCarno

+0

您是否有關於發生此錯誤的機器的更多信息?特別是,顯卡類型(供應商,可能還有驅動版本)?或者在發生此錯誤時在後臺運行的任何第三方軟件?事實上,它發生在不同的操作系統和不同的JRE上,這表明這些機器必須有其他共同的東西導致此錯誤。 – Marco13

+0

@LuigiEdlCarno調整窗口大小會觸發重繪,並且工件消失。工件組件不響應用戶交互。如果你點擊它們(在屏幕截圖的情況下),它將選擇底層JTable中該位置的那一行,並且該行將被重新繪製。 – Jason

回答

5

爲了有這個問題「關閉」(即回答)在這裏,從意見的結果:

Marco13:雖然我從來沒有遇到過這樣的錯誤,它可能是值得一試-Dsun.java2d.opengl = true或-Dsun.java2d.d3d =假

(指在http://docs.oracle.com/javase/7/docs/technotes/guides/2d/flags.html#d3d列出的VM標誌)

Jason:添加-Dsun.java2s.d3d糾正了該問題。

(我認爲這稱爲設置-Dsun.java2s.d3d = ,因爲它是默認啓用)


關於從最後的評論的問題:

您是否認爲啓用Direct3D支持(用於數據輸入應用程序)會帶來某種性能好處?

我還沒有使用d3d標誌,但只有opengl標誌用於某些實驗,而不是用於性能測試。所以我不知道這個標誌在多大程度上影響了性能。再一次,我的直覺是,對於簡單的應用程序,這應該不會有真正的效果。使用「簡單」,我的意思是僅使用標準GUI組件的應用程序,並且不要通過Graphics2D以覆蓋的paintComponent方法執行復雜的自定義渲染操作。但根據屏幕截圖,此應用程序可能至少涉及Swing中存在的最複雜的「標準GUI組件」 - 即JTable。因此,如果您有ScrollPane中的大型JTable(可能具有複雜的自定義CellRenderer),則應該考慮對性能影響進行專門測試,以儘可能減少目標機器的性能(最好是最慢)。

2

「-Dsun.java2d.opengl = true」在我遇到與jTables類似的問題時爲我做了訣竅。

但是「-Dsun.java2d.d3d = false」讓我不滿意。