2011-04-18 26 views
2

我創建了一個小程序,它有一個大面板來顯示由幾個控件(按鈕,文本框等)包圍的數據。大面板包含我自己渲染的幾層標籤。工具提示消失後如何重繪?

控件都具有與它們關聯的工具提示,其中一些工具提示與主面板重疊。當它們消失時,它們在主面板圖像中留下一個洞,直到主面板被重新粉刷。

現在介意你,這並不總是會發生。只有當光標在一定範圍內時纔會出現。如果距離左側或右側足夠遠(Y軸上的變化沒有區別),當工具提示消失時,這些孔會被覆蓋。

我並不十分熟悉工具提示和重繪應該如何工作,如果這是一個跡象表明我的程序存在某些可怕的錯誤,但是如果我可以在工具提示時在主面板上調用repaint消失了,我應該沒事的。有什麼我可以在工具提示覆蓋,使這種情況發生?

我使用的是Swing

謝謝。

+2

SSCCE會很好。 – jzd 2011-04-18 18:00:14

+0

我想我應該嘗試在發佈之前創建SSCCE。在試圖將我的程序剝離到SSCCE的過程中,我發現了這個問題:當我不應該擁有時,我將其中一個標籤設置爲不透明。刪除線設置爲不透明解決了問題,但它並沒有真正回答我發佈的問題。 – BCarpe 2011-04-18 18:51:53

+3

@BCarpe,這是SSCCE的目的。構建它可以揭示問題或者給你足夠小的東西,以便其他人可以快速地使用它。 – jzd 2011-04-18 19:14:41

回答

1

回答你的問題(在你通過註釋找到解決方案之後):Swing內置了一些相當精細的重繪管理。當工具提示消失時,它下面的矩形被重新繪製。

現在,哪些組件必須重新繪製?所有那些與給定的矩形重疊,並沒有被其他組件隱藏(在該區域中) - 但只有不透明的組件在這裏計數。 (這是我們需要JComponent的情況opaque財產的全部理由 - 優化重繪)

你的標籤,宣佈自己是不透明的,但並沒有真正畫上一個paintComponent它的整個區域,並提示這類的區域,該區域應該由標籤覆蓋保持未上漆。

將您的標籤聲明爲部分透明也會導致其後面組件的相關區域被重新繪製。

+0

好吧,那給了我所有我真正需要的信息。所以謝謝你,Paŭlo。但是要回答這個問題要徹底,有沒有辦法在工具提示消失時專門調用repaint()?或者試圖做這樣的事情只是表明可憐的編程習慣? – BCarpe 2011-04-19 13:37:34

+0

通過閱讀'JToolTip'的文檔,您必須繼承顯示JLabel的工具提示並覆蓋它們的'createToolTip'方法。然後你可以添加一些監聽器(也許ComponentListener?)到你的工具提示對象中,或者重寫他們的'removeNotify'方法,然後在正確的對象上調用repaint。這看起來更復雜,並不能完全解決問題,因爲當你的窗口被其他窗口覆蓋時,你的重繪問題也會出現,我想。另外,通常的重繪只會重繪缺陷的矩形,而不是所有的東西。 – 2011-04-19 13:47:06