Изменение цвета фона строки в JTable

у меня есть JTable с 3 столбцами. Я установил TableCellRenderer для всех 3 столбцов, как это (может быть, не очень эффективно?).

 for (int i = 0; i < 3; i++) {
     myJTable.getColumnModel().getColumn(i).setCellRenderer(renderer);
 }

на getTableCellRendererComponent() возвращает компонент со случайным цветом фона для каждой строки.
Как я могу изменить фон на другой случайный цвет во время работы программы?

5 ответов


один из способов будет хранить текущий цвет для каждой строки в модели. Вот простая модель, которая фиксируется в 3 столбцов и 3 строк:

static class MyTableModel extends DefaultTableModel {

    List<Color> rowColours = Arrays.asList(
        Color.RED,
        Color.GREEN,
        Color.CYAN
    );

    public void setRowColour(int row, Color c) {
        rowColours.set(row, c);
        fireTableRowsUpdated(row, row);
    }

    public Color getRowColour(int row) {
        return rowColours.get(row);
    }

    @Override
    public int getRowCount() {
        return 3;
    }

    @Override
    public int getColumnCount() {
        return 3;
    }

    @Override
    public Object getValueAt(int row, int column) {
        return String.format("%d %d", row, column);
    }
}

отметим, что setRowColour звонки fireTableRowsUpdated; это приведет к обновлению только этой строки таблицы.

визуализатор может получить модель из таблицы:

static class MyTableCellRenderer extends DefaultTableCellRenderer {

    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
        MyTableModel model = (MyTableModel) table.getModel();
        Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
        c.setBackground(model.getRowColour(row));
        return c;
    }
}

изменение цвета строки будет так же просто, как:

model.setRowColour(1, Color.YELLOW);

резюме ответа Ричарда фирна, чтобы сделать каждую вторую строку серой:

jTable.setDefaultRenderer(Object.class, new DefaultTableCellRenderer()
{
    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
    {
        final Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
        c.setBackground(row % 2 == 0 ? Color.LIGHT_GRAY : Color.WHITE);
        return c;
    }
});

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

однако я склонен полагать, что обычно при использовании JTable у вас будут разные типы данных в каждом столбце, и поэтому вы не будете использовать один и тот же визуализатор для каждого столбца. В этих случаях вы можете найти Таблица Рендеринга Строк подход helpfull.


это в основном так же просто, как перекрасить таблицу. Однако я не нашел способа выборочно перекрасить только одну строку/столбец/ячейку.

в этом примере, нажав на кнопку изменяет цвет фона для строки, а затем вызывает метод repaint.

public class TableTest {
    public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        final Color[] rowColors = new Color[] {
                randomColor(), randomColor(), randomColor()
        };
        final JTable table = new JTable(3, 3);
        table.setDefaultRenderer(Object.class, new TableCellRenderer() {
            @Override
            public Component getTableCellRendererComponent(JTable table,
                    Object value, boolean isSelected, boolean hasFocus,
                    int row, int column) {
                JPanel pane = new JPanel();
                pane.setBackground(rowColors[row]);
                return pane;
            }
        });
        frame.setLayout(new BorderLayout());

        JButton btn = new JButton("Change row2's color");
        btn.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                rowColors[1] = randomColor();
                table.repaint();
            }
        });

        frame.add(table, BorderLayout.NORTH);
        frame.add(btn, BorderLayout.SOUTH);
        frame.pack();
        frame.setVisible(true);
    }

    private static Color randomColor() {
        Random rnd = new Random();
        return new Color(rnd.nextInt(256),
                rnd.nextInt(256), rnd.nextInt(256));
    }
}

вызов getTableCellRendererComponent(...) включает значение ячейки, для которой требуется визуализатор.

Вы можете использовать это значение для вычисления цвета. Если вы также используете AbstractTableModel, вы можете предоставить значение произвольного типа вашему визуализатору.

Если у вас есть цвет, вы можете setBackground() на компоненте, который вы возвращаете.