Попытка покрасить определенные строки JTable, используя Custom Renderer, вместо этого все мои строки окрашены
Для моей программы на Java, в основном, когда значение в столбце 4 моей JTable больше, чем в столбце 3, я хочу, чтобы эти конкретные строки были окрашены в красный цвет, а не другие строки.
Я реализовал следующий код, но по какой-то причине все мои строки окрашиваются в красный цвет, а не только те, которые соответствуют критериям.
table.setDefaultRenderer(Object.class, new DefaultTableCellRenderer(){
@Override
public Component getTableCellRendererComponent(JTable table,
Object value, boolean isSelected, boolean hasFocus, int row, int col) {
super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, col);
int Value1= Integer.parseInt(table.getModel().getValueAt(row, 3).toString());
int Value2= Integer.parseInt(table.getModel().getValueAt(row, 4).toString());
if (Value2>=Value1) {
setBackground(Color.red);
}
return this;
}
});
Любые предложения / советы о том, как это исправить?
2 ответа
DefaultTableCellRenderer
Экземпляр использует компонент шаблона для визуализации всех ячеек (а именно, сам, см. документацию). Как только вы установите цвет, шаблон будет иметь этот цвет и будет применен ко всем последующим ячейкам.
Что вам нужно сделать, так это в своей логике, установите красный цвет в нужных вам случаях и установите для него цвет фона по умолчанию во всех остальных случаях.
if(!isSelected) {
if (Value2>=Value1) {
setBackground(Color.red);
} else {
setBackground(table.getBackground()); // or use another color for another background
}
}
Глядя на ваш код еще раз, я замечаю, что вы делаете ошибку в отношении индексов модели и вида. getTableCellRendererComponent
метод вызывается с индексами представления, но вы используете их для индексации модели (например, в table.getModel().getValueAt(row, 3)
). Когда ваша таблица отсортирована, результаты будут неверными, так как индексы моделей и индексов представлений будут отличаться.
Если вам нужно получить значения из модели, вам сначала нужно преобразовать индексы представления в индексы модели. использование JTable.convertRowIndexToModel
а также JTable.convertColumnIndexToModel
сделать это. Например:
int modelRowId = table.convertRowIndexToModel(row);
int Value1= Integer.parseInt(table.getModel().getValueAt(modelRowId, 3).toString());
int Value2= Integer.parseInt(table.getModel().getValueAt(modelRowId, 4).toString());
Взгляните на Table Row Rendering, который показывает, как это сделать, переопределив prepareRenderer(...)
метод JTable.
Используя этот подход, вам не нужно настраивать визуализатор для каждого типа данных в таблице.