小弟,初来贵地没有积分,望个位大大指点下。十分感谢。
我想实现JTable的某列Header的浮雕话显示。测试代码如下:
JTable jTable = new JTable();
JTableHeader jheader = jTable.getTableHeader();
DefaultTableCellRenderer cellRenderer = new DefaultTableCellRenderer();
cellRenderer.setHorizontalAlignment(SwingConstants.CENTER);
cellRenderer.setBorder(BorderFactory.createEtchedBorder(EtchedBorder.LOWERED, Color.RED,Color.black));
jheader.getColumnModel().getColumn(2).setHeaderRenderer(cellRenderer);上面的代码,header的颜色设定上去了,但是浮雕化效果没有出来,原因不明。在winxp下测试的。

解决方案 »

  1.   

        DefaultTableCellRenderer renderer = new DefaultTableCellRenderer() {
          public Component getTableCellRendererComponent(JTable table,
              Object value, boolean isSelected, boolean hasFocus, int row,
              int column) {        if (isSelected) {
              super.setForeground(table.getSelectionForeground());
              super.setBackground(table.getSelectionBackground());
            } else {
              super
                  .setForeground((unselectedForeground != null) ? unselectedForeground
                      : table.getForeground());
              super
                  .setBackground((unselectedBackground != null) ? unselectedBackground
                      : table.getBackground());
            }        setFont(table.getFont());        if (hasFocus) {
              Border border = null;
              if (isSelected) {
                border = UIManager
                    .getBorder("Table.focusSelectedCellHighlightBorder");
              }
              if (border == null) {
                border = UIManager.getBorder("Table.focusCellHighlightBorder");
              }
              setBorder(border);          if (!isSelected && table.isCellEditable(row, column)) {
                Color col;
                col = UIManager.getColor("Table.focusCellForeground");
                if (col != null) {
                  super.setForeground(col);
                }
                col = UIManager.getColor("Table.focusCellBackground");
                if (col != null) {
                  super.setBackground(col);
                }
              }
            } else {
              //System.out.println("ABC");
              setBorder(getNoFocusBorder());
            }        setValue(value);        return this;
          }
        };这是DefaultTableCellRenderer的源码, 注意我加了一句红色的. 因为TableHeaderUI调用Renderer的时候hasFocus这个参数永远是false的, 因此永远调用到蓝色的一句. 而这个getNoFocusBorder()返回的是边框为1个象素的EmptyBorder. 原因可能就在于此了.
    JTableHeader的默认CellRenderer可以在JTableHeader的类里面看到, 是个内部类, 叫UIResourceTableCellRenderer, 当然private的, 没有办法继承. 不过相信看了以后你的问题也许不会再是问题了吧.