2013-03-15 317 views
5

在我的應用程序中,我顯示一個彈出對話框來顯示大量卡片列表。我將它們顯示爲JPanel子類中許多JLabel組件中的圖像。然後,我把這個對象放在JScrollPane中,允許水平滾動卡片。帶透明背景和內容的JScrollPane

我想讓未使用的空間透明並帶有深色背景,以表明它背後的內容已被禁用。我使用setBackground(new Color(50, 50, 50, 200))來實現我想要的外觀,但它後面的內容不會重繪,所以我得到了人爲因素。

這裏是什麼樣子:

Artifacting when scrolling

我如何去解決這個?當我滾動時,如何獲取它後面的內容以重繪?

在此先感謝。

回答

6

從窗口中取出窗口。

JScrollPane包含JViewport然後包含您的內容。因此,您需要將內容窗格設置爲透明,將視口設置爲透明,然後將滾動窗格設置爲透明。

您可以在每個容器上使用setOpaque(false)來實現此目的。

這將確保重繪管理器現在將通過背景進行繪製。

接下來的問題是,Swing實際上不支持「半透明」組件(即它不透明或不透明)。

您可以通過覆蓋主要成分的paintComponent方法實現這個(在一個視口可能就足夠)

+0

良好的調用'JViewport'。不知道存在。我使用了兩個答案的組合來修復它。 – MaxGhost 2013-03-15 02:36:52

1

請嘗試以下......在滾動過程中可能給你一些救濟。 當主框架最大化時,您可能還有問題 或已恢復。您將需要一個偵聽器來處理這些事件,並需要一個類似的修復程序。

jScrollPane.getVerticalScrollBar().addAdjustmentListener(new AdjustmentListener() { 
     @Override 
     public void adjustmentValueChanged(final AdjustmentEvent e) { 
      sevenWondersframe.repaint(); 
     } 
    }); 
    jScrollPane.getHorizontalScrollBar().addAdjustmentListener(new AdjustmentListener() { 
     @Override 
     public void adjustmentValueChanged(final AdjustmentEvent e) { 
      sevenWondersframe.repaint(); 
     } 
    }); 
+0

謝謝。我使用了兩個答案的組合來修復它。 – MaxGhost 2013-03-15 02:37:43