2011-02-13 98 views
2

我最近問了一個關於半透明組件造成奇怪的文物看起來沒有正確更新的問題。我收到的答案導致文物消失,但代價是半透明。Java Swing - 半透明組件

解決方案是爲每個半透明組件調用setOpaque(false)函數。這樣,Swing知道它需要重繪這些組件背後的背景。

但是,這是以我試圖實現的半透明爲代價的。它導致組件變得透明。

前提是:我正在爲聊天客戶端設計GUI,並且功能請求是有背景的。我通過遵循用於擴展JPanel類的代碼片段成功地獲得了後臺工作,但後來我希望組件允許背景顯示。在設置了半透明性之後,更新組件的殘餘部分將顯示在他們本不應該出現的地方。我來到這裏解決了我的問題,但現在我遇到了一個新問題。所以我們就在這裏。

所以,這裏是我所推測:

-Calling每個所需的組件setOpaque(假)功能,而不是設置一個半透明的顏色沒有達到我想要的。

- 設置半透明顏色而不調用setOpaque(false)允許顯示半透明背景,但會導致人爲現象,讓我回到原點。

所以我需要一些中間地帶,透明的沒有文物,半透明的文物。也就是說,我想要一個沒有僞影的半透明背景(不完全透明)。

看來我需要重寫JFrame以使其重新繪製其所有組件,而不管其透明度如何。除非有什麼我錯過了..這就是我來這裏的原因!

謝謝!

(這裏是原來的問題的鏈接,以供參考圖片:Java Swing - Translucent Components causing Artifacts

回答

4

一個選擇是自己重載元件並繪製背景:

class TranslucentLabel extends JLabel { 
    public TranslucentLabel(String text) { 
     super(text); 
     setOpaque(false); 
    } 

    @Override 
    public void paintComponent(Graphics g) { 
     g.setColor(new Color(255, 0, 0, 64)); 
     Insets insets = getInsets(); 
     g.fillRect(insets.left, insets.top, 
       getWidth() - insets.left - insets.right, 
       getHeight() - insets.top - insets.bottom); 
     super.paintComponent(g); 
    } 
} 

編輯:另外,您可以將子組件的半透明背景顏色直接繪製到面板上,那麼您將不必覆蓋組件:

class YourPanel extends JPanel { 
    @Override 
    protected void paintComponent(Graphics g) { 
     Graphics2D g2d = (Graphics2D)g.create(); 

     // Draw your background image here to g2d. 

     g2d.setColor(new Color(255, 0, 0, 64)); 
     Area area = new Area(); 
     for (Component component : getComponents()) { 
      area.add(new Area(component.getBounds())); 
     } 
     g2d.fill(area); 
     g2d.dispose(); 
    } 
} 

這種方法有一個缺點。如果組件的真正透明部分(例如圓形邊框),則其整個背景將被着色。

+0

我已經覆蓋了JPanel類以允許自定義背景。具有背景的JPanel是我的框架的內容窗格。將overpade JPanel加入並強制不透明的組件重新繪製會更好嗎?這樣我就不必重寫我使用的所有組件。 – 2011-02-13 14:41:43