2011-03-25 188 views
2

我想創建一個透明的JTable。表本身並沒有強加太多的問題,我在JTable上實現了TableModel和TableCellRenderer,並設置了setOpaque(false),JScrollPane和JScrollPane的封閉JScrollPane和ViewPort。如何使JTable的標頭透明

該表現在正確地繪製標題,因爲它位於JScrollPane中,所以我設置了自己的TableCellRenderer以使用getTableHeader().setDefaultRenderer(new TaskTableHeaderRenderer());來呈現標題。我希望這也是透明的,只需使用JLabel的文本即可。但儘可能地嘗試,我無法得到它。渲染器肯定提供了一個透明的組件(我甚至試圖僅僅使用一個setapaque(false)的JPanel),我甚至在JTableHeader上嘗試了setOpaque(false),併爲所有有問題的組件設置了透明背景顏色。似乎沒有任何幫助。

我使用的LookAndFeel是PlasticGPLookAndFeel by JGoodies,但我試過金屬和Windows外觀&感覺實現也無濟於事。此外,調試表明PlasticXPLookAndFeel使用BasicTableHeaderUI而不進行子類化。

那麼我怎樣才能實現透明表頭?

回答

-1

也許重寫paintBackground()並使其不能調用super.paintBackground()?

+0

嗯,這 「paintBackground法」 你在說什麼以後?我已經檢查了整個繼承樹,但沒有一個類似乎有這個名字的方法。 – 2011-03-26 11:47:25

+0

基本上你有3種方法:paintBorder(),paintComponent()和paintChildren()。 [遺憾的是paintBackground(),內存錯誤服務於我]嘗試使用代表表頭的組件的paintComponent/paintBorder玩... – iluxa 2011-03-28 17:05:28

2

你可以先創建一個cellRenderer的

public class OpaqueHeader extends DefaultTableCellRenderer { 

    @Override 
    public Component getTableCellRendererComponent(JTable arg0, Object ob, 
      boolean arg2, boolean arg3, int arg4, int arg5) { 
     JLabel t = new JLabel(ob.toString()); 
     t.setOpaque(false); 
     t.setForeground(Color.black); 
     return t; 
    } 
} 

,並在您的JTable對象

table.getTableHeader().setDefaultRenderer(new OpaqueHeader()); 
+0

好吧,正如問題中提到的那樣,我已經這樣做了,但它不會幫幫我。我已經更新了這個問題,更直接地提到這個事實。你是否驗證過你的解決方案 – 2011-03-26 11:25:33

+0

這將刪除表頭的一些有用功能,例如渲染排序圖標 – pstanton 2013-05-09 10:56:32

3
Table.getTableHeader().setOpaque(false); 
Table.getTableHeader().setBackground(new Color(0,0,0,0.6f)); 
Table.getTableHeader().setForeground(Color.white);