Изменить цвет фона строки в JTable - PullRequest
20 голосов
/ 06 октября 2010

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

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

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

Ответы [ 5 ]

24 голосов
/ 19 июля 2012

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

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;
    }
});
21 голосов
/ 06 октября 2010

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

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

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

1 голос
/ 06 октября 2010

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

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

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

1 голос
/ 06 октября 2010

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

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

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