2013-09-30 3 views
0

Моя проблема заключается в том, что я хочу изменить индивидуальный цвет фона ячейки в одном столбце в jTable. Код, который я придумал, меняет цвет на один, и он применяется ко всем столбцам. Что я делаю не так?Как изменить цвет ячейки jTable с помощью CustomRenderer

Это мой код

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

Cell рендеринг происходит очень часто. Вы не хотите выполнять вызов SQL как часть вашего рендеринга. Кроме того, вы должны регистрировать SQLException, когда это происходит, вместо того, чтобы молча проглотить его.

В этом случае вы сохраняете результирующий набор как поле в средстве визуализации ячеек. При первом рендеринге вы выполняете итерацию до конца результирующего набора.

Вместо запроса для статуса используйте параметр value, который передается рендереру. Это будет значение в отображаемой ячейке. Если вам нужна ценность другой ячейки, получите ее из TableModel.

Смежные вопросы