2013-06-22 30 views
0

因此,這個問題的初始設置是有一個JDialog,並且裏面放置了一個可容納其餘組件的JPanel(因爲繪製JDialog本身顯然是一個壞主意)。此JPanel具有覆蓋paintComponent(Graphics g)方法,該方法僅繪製背景併爲美學目的添加了一個微弱的邊框。如何用JDialog,JPanel解決圖形問題?

現在裏面是一系列對所包含的表單組件進行分類的JPanel,並且每個JPanel都有一個重寫的paintComponent(Graphics g),並繪製一個半透明的背景。

在這些JPanels中,我開始遇到一些問題,可能是透明度問題。我在這些面板內部有JTextFields,JCheckBoxes,JLabels,JSliders等,當你與其中一個(懸停,點擊等)交互時,背景從透明變爲不透明,來自另一個場的偶爾幻影圖像有時)。我正在使用custom LAF called Web,但我使用其他內置LAF進行了測試,結果也是如此。

這是Java的故障還是我搞砸了?如果是這樣,我該如何修補它?如果需要,我可以稍後粘貼代碼片段,但我已經使用了幾個自定義類和九塊拼接樣式圖像拼接,這可能會使代碼片段難以遵循。提前致謝!

+1

請確保繪製透明度的組件已被設置爲透明(setOpaque(false)),這將讓重繪管理器知道它必須繪製背後的內容 – MadProgrammer

+1

此外,非常重要的是,確保您請在執行任何自定義繪製之前調用'super.paintComponent' – MadProgrammer

+0

爲了更快地獲得更好的幫助,請發佈[SSCCE](http://sscce.org/)。 –

回答

2

如果您正在繪製具有透明背景的組件,則組件標記爲透明(setOpaue(false))非常重要,以便重繪管理器知道它必須繪製它下面的組件。

當您執行自定義繪畫時,首先請撥打super.paintComponent也非常重要。

這對於透明組件的情況尤其重要,因爲這爲繪畫準備了上下文。

Graphics是一個共享資源。您窗口中繪製的所有組件都將共享相同的對象,這意味着如果您不允許paintComponent首先準備它,那麼您將看到之前繪製的內容。