Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

Один из способов - сохранить текущий цвет для каждой строки в модели. Здесь простая модель, которая фиксируется в 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);

Ответ 2

Resumee of Richard Fearn ответит, чтобы каждая вторая строка была серой:

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;
    }
});

Ответ 3

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

Однако я склонен полагать, что в целом при использовании JTable у вас будут разные типы данных в каждом столбце, и поэтому вы не будете использовать один и тот же рендерер для каждого столбца. В этих случаях вы можете найти полезный Table Row Rendering.

Ответ 4

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

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

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 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));
    }
}

Ответ 5

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

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

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