Выделите указанную строку JTable

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

Дело в том, что когда я добавляю новую пустую строку в свой JTable, я хочу выделить ее серым цветом. Итак, это работает для первого, но когда я пытаюсь добавить вторую строку, вторая будет белой ...

Я попытался отладить, но безуспешно, я не нашел своей ошибки.

Вот класс, чтобы выделить строку:

class GrayWhiteRenderer extends DefaultTableCellRenderer {

    private int rowToColored;

    GrayWhiteRenderer(int rowToColored) {
        this.rowToColored = rowToColored;
        Color color = UIManager.getColor ( "table.row" );
    }
    @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);
            if (UIManager.getColor ( "table.row" )==Color.GRAY) {
                c.setBackground(Color.GRAY.brighter());
            }
            else if (row == rowToColored) {
                c.setBackground(Color.GRAY.brighter());
            } else {
                c.setBackground(Color.WHITE);
            }
        return c;
    }
}

Я сохраняю индекс всей новой строки в rowToAdd в ее начале (например: [19, 20, 21, -1, -1, ...]. -1 - это знать, когда мне нужно прекратить поиск, если мне нужно выделить больше):

while(rowToAdd[k]!=-1) {
    System.out.println("rowToAdd[k] : "+rowToAdd[k]);
    dataTable.setDefaultRenderer(Object.class, new GrayWhiteRenderer(rowToAdd[k]));
    k++;
}

А вот и класс для проверки:

package Graphic;

import javax.swing.*;
import javax.swing.table.*;
import java.awt.*;
import java.awt.event.*;

class Test implements Runnable, ActionListener {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Test());
    }

    JTable table;

    @Override
    public void run() {
        JFrame frame = new JFrame("Custom Cell Renderer");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        table = new JTable(new DefaultTableModel(0, 2) {
            @Override
            public Class<?> getColumnClass(int c) {
                return Object.class;
            }
        });

        class GrayWhiteRenderer extends DefaultTableCellRenderer {
            private int rowToColored;
            GrayWhiteRenderer(int rowToColored) {
                this.rowToColored = rowToColored;
            }
            @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);
                if (UIManager.getColor ( "table.row" )==Color.GRAY) {
                    c.setBackground(Color.GRAY.brighter());
                }
                else if (row == rowToColored) {
                    c.setBackground(Color.GRAY.brighter());
                } else {
                    c.setBackground(Color.WHITE);
                }
                return c;
            }
        }

        table.setDefaultRenderer(Object.class, new GrayWhiteRenderer(table.getRowCount()));
        table.setTableHeader(null);

        JButton btn = new JButton("Add Row");
        btn.addActionListener(this);

        JToolBar bar = new JToolBar();
        bar.setFloatable(false);
        bar.add(btn);

        JPanel content = new JPanel(new BorderLayout());
        content.add(bar, BorderLayout.NORTH);
        content.add(new JScrollPane(table), BorderLayout.CENTER);

        frame.setContentPane(content);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    @Override
    public void actionPerformed(ActionEvent ae) {
        int nextRow = table.getRowCount();
        DefaultTableModel model = (DefaultTableModel)table.getModel();
        model.addRow(new Object[] { "" + nextRow, "" + nextRow });
        for(int i=0; i<model.getColumnCount(); i++) {
            table.setDefaultRenderer(Object.class, new GrayWhiteRenderer(i));
        }
    }

}

Предоставьте минимальный воспроизводимый пример, чтобы мы также смогли воспроизвести вашу проблему. Код, который вы разместили здесь, не дает мне никаких подсказок о причине вашей проблемы.

Sergiy Medvynskyy 28.05.2018 11:38
«Я знаю, что есть предыдущие темы для аналогичной проблемы, но даже с ними я не смог решить свою проблему». Перечислите 3 наиболее полезных и объясните, почему они не помогли. Ваш отчет типичен для людей, которые провели 0 исследований, но знают, что это ожидаемо.
Andrew Thompson 28.05.2018 11:56

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

user8007559 28.05.2018 12:01
"Извини, если ты думаешь .." Совет: добавьте @SergiyMedvynskyy (или кого бы то ни было, @ важен) в поставить в известность человека нового комментария. (Я понимаю, что вы мне ответили, но подумал, что дам вам ti [для справок в будущем.) «Я тогда перечислю темы» Дайте мне знать, когда закончите.
Andrew Thompson 28.05.2018 13:06

@AndrewThompson, вот несколько тем: ссылка на сайт, ссылка на сайт

user8007559 28.05.2018 14:02
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
5
40
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Итак, я исправил ваш пример. Вот ваш код с моими комментариями

@Override
public void actionPerformed(ActionEvent ae) {
    int nextRow = table.getRowCount();
    DefaultTableModel model = (DefaultTableModel) table.getModel();
    model.addRow(new Object[] {"" + nextRow, "" + nextRow});
    // the correct row is: nextRow. No loop required here.
    table.setDefaultRenderer(Object.class, new GrayWhiteRenderer(nextRow));
}

Я бы также исправил ваш рендерер, чтобы выделить выделение

class GrayWhiteRenderer extends DefaultTableCellRenderer {
    private int rowToColored;

    GrayWhiteRenderer(int rowToColored) {
        this.rowToColored = rowToColored;
    }

    @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);
        // As I know there is no value is registered for "table.row" in UIManager
        // so I've skipped the first condition
        if (row == rowToColored) {
            c.setBackground(Color.GRAY.brighter());
        } else {
            // use correct color depended on whether the cell is selected or not!
            c.setBackground(isSelected ? table.getSelectionBackground() : table.getBackground());
        }
        return c;
    }
}

Я подумал, что нужно использовать петлю. Вторая часть должна быть ясна мне сейчас благодаря вам.

user8007559 28.05.2018 14:06

@Corentin lifehack: если вы примете мой ответ как правильный (флажок слева от моего ответа), вы получите 2 очка репутации;)

Sergiy Medvynskyy 28.05.2018 14:23

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