Вопрос

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

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

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

Это было полезно?

Решение

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

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

Resumee of Richard Fearn's Ответ, сделать каждую вторую строку серую:

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 у вас будет разные типы данных в каждом CoLumm и, следовательно, вы не будете использовать тот же рендер для каждого столбца. В этих случаях вы можете найти Рендеринг строки таблицы Подход Helpfull.

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

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

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(...) Включает значение ячейки, для которого требуется рендер.

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top