Цвет только определенных ячеек в JTable

Я ищу решение этой проблемы: у меня есть файл excel, содержащий данные. Некоторые ячейки имеют желтый фон. Я уже создал код для импорта текста в JTable, который отлично работает. Но я хочу также импортировать фоновый цвет ячейки в определенные ячейки. Для простоты этого примера я не использовал циклы, чтение данных excel из исходников и т. д. Почитав форум, я понял, что мне нужен CustomCellRenderer.

У меня есть проблема с этим подходом, потому что этот код сначала правильно окрашивает ячейки в столбце, но когда я начинаю прокручивать цветные ячейки в этой таблице, он перекрашивает весь столбец в желтый цвет. (см. скриншот)

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

Можете ли вы указать мне решение по этому вопросу? (это ошибка или ожидаемое поведение JTable?). Я использую NetBeans и генератор перетаскивания GUI

введите здесь описание изображения

import java.awt.Color;
import java.awt.Component;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;

public class MyRenderer extends DefaultTableCellRenderer {

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

        int[][] coordinatesYellow = new int[3][2];
        //[row][column] these cells are yellow
        coordinatesYellow[0][0] = 3;
        coordinatesYellow[0][1] = 2;
        coordinatesYellow[1][0] = 4;
        coordinatesYellow[1][1] = 2;
        coordinatesYellow[2][0] = 2;
        coordinatesYellow[2][1] = 2;

        for (int i = 0; i < 3; i++) {
            if ((row == coordinatesYellow[i][0]) && (column == coordinatesYellow[i][1])) {
                c.setBackground(Color.yellow);
            }
        }
        return c;
    }
} 



// And this is the statement I use for calling the renderer:
// resultsTable.getColumnModel().getColumn(0).setCellRenderer(new MyRenderer());

person radox1912    schedule 11.01.2016    source источник
comment
@TT - ваш комментарий, по сути, является полным ответом.   -  person tucuxi    schedule 11.01.2016
comment
@tucuxi Правда, это звучало так тривиально, что я написал комментарий. Я сделал это ответом.   -  person TT.    schedule 11.01.2016
comment
Также см. stackoverflow.com/questions/22606227/colored-table-cells (может даже быть дубликатом. ..)   -  person Marco13    schedule 11.01.2016


Ответы (1)


Сделайте так, чтобы когда ваша ячейка не была желтой, вы устанавливали фон белым (или цветом фона таблицы).

Средство визуализации, расширяющее DefaultTableCellRenderer, использует тот же компонент (JLabel) в качестве шаблона для всех ячеек (см. DefaultTableCellRenderer примечания по реализации — они называют это штамповкой). Как только вы установите его фон на желтый, он останется желтым для отображения последовательных ячеек, пока вы снова не измените цвет фона.

Замените цикл for чем-то вроде следующего:

boolean isYellow = false;
for (int i = 0; i < 3; i++) {
            if ((row == coordinatesYellow[i][0]) && (column == coordinatesYellow[i][1])) {
                c.setBackground(Color.yellow);
                isYellow = true;
            }
        }
if( !isYellow )
  c.setBackground(Color.white);
person TT.    schedule 11.01.2016
comment
Это не работает так, как задумано. Если я добавлю оператор else в цикл for, результатом будет только ячейка sampletext, выделенная желтым цветом, потому что цикл for перезаписывает результаты. - person radox1912; 11.01.2016
comment
@ radox1912 Во всех случаях, когда вы не устанавливаете желтый цвет... Это означает, что если вы ничего не установили в желтый цвет, вы должны установить его в белый цвет. - person TT.; 11.01.2016
comment
@ radox1912 Я добавил сегмент кода, отражающий мое утверждение. - person TT.; 11.01.2016
comment
Я протестировал решение, логическое значение isYellow делает свое дело! Большое Вам спасибо. - person radox1912; 12.01.2016
comment
@ radox1912 Вы можете больше всего поблагодарить меня, приняв ответ (проверив галочку в левом верхнем углу ответа). Пожалуйста, кстати =) - person TT.; 12.01.2016