2013-09-30 81 views
0

我的问题是我想更改jTable中一列中单元格的单独背景颜色。我提出的代码将颜色更改为一个,它适用于所有列。我究竟做错了什么?如何使用CustomRenderer更改jTable单元格颜色

这是我的代码

public void fillReserveTable() { 
    MemberDAO dao = DATA.MemberDAO.getInstance(); 
    ResultSet res2 = dao.fillReservationTable(); 
    try { 
     if (res2.next()) { 
      res2.beforeFirst(); 
      reserveTable.setModel(DbUtils.resultSetToTableModel(res2)); 
      setUpOnHold(reserveTable, reserveTable.getColumnModel().getColumn(4)); 
      reserveTable.getColumnModel().getColumn(3).setCellRenderer(new CustomRenderer()); 
      jScrollPane14.setVisible(true); 
     }else{ 
      jScrollPane14.setVisible(false); 
     } 
    } catch (SQLException e) { 
    } 
} 

class CustomRenderer extends DefaultTableCellRenderer { 

    MemberDAO dao = DATA.MemberDAO.getInstance(); 
    ResultSet res2 = dao.fillReservationTable(); 

    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { 
     Component cellComponent = super.getTableCellRendererComponent(reserveTable, value, isSelected, hasFocus, row, column); 
     int row2 = 0; 
     try { 
      while (res2.next()) { 
       String status = reserveTable.getValueAt(row2, 3).toString(); 
       if (status.equals("Available")) { 
        cellComponent.setBackground(Color.green); 
       } else { 
        cellComponent.setBackground(Color.red); 
       } 
       row2++; 
      } 
     } catch (SQLException e) { 
     } 
     return cellComponent; 
    } 
} 

回答

2

细胞呈现发生非常频繁。你不想执行一个SQL调用作为你的渲染的一部分。此外,您应该在发生SQLException时记录它,而不是无声地吞咽它。

在这种情况下,您将结果集作为字段存储在单元格渲染器中。第一次渲染时,你迭代到结果集的末尾。

而不是查询状态,使用传递给渲染器的value参数。这将是正在渲染的单元格中的值。如果您需要其他单元格的值,请从TableModel中获取它。