Попытка покрасить определенные строки 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.

Используя этот подход, вам не нужно настраивать визуализатор для каждого типа данных в таблице.

Другие вопросы по тегам