2011-03-25 187 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);