2013-09-28 76 views
2

我試圖使我的JTable標題的背景具有漸變。JTable標題渲染器

這使用的代碼工作正常:

 String[] colName = new String[] { "#", "Location", "Name" ,"Source", "System", "Hits", "Current", "Time" }; 
     Object[][] products = new Object[][] { 

      }; 

     dtm = new DefaultTableModel(products, colName) { 
      @Override 
      public boolean isCellEditable(int row, int column) { 
       //all cells false 
       return false; 
      } 
     }; 

     table = new JTable(dtm); 
     table.setRowHeight(32); 
     table.getTableHeader().setReorderingAllowed(false); 
     table.setDefaultRenderer(Object.class, new VisitorRenderer()); 
     table.setFont(new java.awt.Font("Tahoma", Font.PLAIN, 12)); 

     table.getColumnModel().getColumn(0).setMinWidth(5); 
     table.getColumnModel().getColumn(1).setMinWidth(50); 
     table.getColumnModel().getColumn(2).setMinWidth(5);    
     table.getColumnModel().getColumn(3).setMinWidth(5); 
     table.getColumnModel().getColumn(4).setMinWidth(5); 
     table.getColumnModel().getColumn(5).setMinWidth(3); 
     table.getColumnModel().getColumn(6).setMinWidth(230); 
     table.getColumnModel().getColumn(7).setMinWidth(3); 

final JTableHeader header = table.getTableHeader(); 
header.setPreferredSize(new Dimension(100, 37)); 

header.setDefaultRenderer(new DefaultTableCellHeaderRenderer() { 
    private Object selectedColumn; 

    @Override 
    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 

     Graphics2D g2d = (Graphics2D) g; 
     g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
      RenderingHints.VALUE_ANTIALIAS_ON); 
     GradientPaint gp = new GradientPaint(0, 0, 
      new java.awt.Color(237, 237, 237), 0, getHeight(), 
      new java.awt.Color(222, 222, 222)); 
     g2d.setPaint(gp); 
     g2d.fillRect(0, 0, getWidth(), getHeight()); 
    }     

    @Override 
    public Component getTableCellRendererComponent(
     JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { 
     DefaultTableCellHeaderRenderer rendererComponent = (DefaultTableCellHeaderRenderer) super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); 

     if (selectedColumn == value) { 
      rendererComponent.setBorder(BorderFactory.createCompoundBorder(rendererComponent.getBorder(), BorderFactory.createLineBorder(Color.red, 1))); 
      rendererComponent.setHorizontalAlignment(SwingConstants.LEFT); 
     } else { 
      rendererComponent.setBorder(BorderFactory.createCompoundBorder(rendererComponent.getBorder(), BorderFactory.createEmptyBorder(0, 5, 0, 0))); 
      rendererComponent.setHorizontalAlignment(SwingConstants.CENTER); 
     } 
     if (column == 0) { 
      rendererComponent.setForeground(header.getForeground()); 
     } else { 
      rendererComponent.setForeground(header.getForeground()); 
     } 

     return rendererComponent; 
    } 
}); 

但是由於某種原因,我能不能看到我的邊框和文字,它看起來像文本也得到了應用漸變?

我想讓文字變成黑色,並在我的列之間留下彩色邊框。有任何想法嗎?

+1

爲了更快提供更好的幫助,請發佈[SSCCE](http://sscce.org/)。 –

+0

查看更新:)添加了代碼的其餘部分 – Alosyius

+1

現在顯示的'其餘代碼'仍然不是SSCCE。 :( –

回答

6

這個班級,sun.swing.table.DefaultTableCellHeaderRenderer,這不是一個好的選擇。相反,獲取參考並將其包裝在TableCellRenderer的實施中,如here所示。另見Darryl Burke的Default Table Header Cell Renderer

+1

你的帖子經過搜索處理標題渲染後,Darryl的渲染器變化真的很棒。 – Acewin