Java 更改JTable中某行的背景色

Java 更改JTable中某行的背景色,java,jtable,tablecellrenderer,Java,Jtable,Tablecellrenderer,我有一个3列的JTable。我已经为所有这3列设置了TableCellRenderer(可能不是很有效?) for(int i=0;i

我有一个3列的JTable。我已经为所有这3列设置了
TableCellRenderer
(可能不是很有效?)

for(int i=0;i<3;i++){
myJTable.getColumnModel().getColumn(i).setCellRenderer(渲染器);
}
getTableCellRenderComponent()
为每行返回一个具有随机背景色的组件。

程序运行时,如何将背景更改为其他随机颜色?

这基本上与重新绘制表格一样简单。然而,我还没有找到一种方法来选择性地重新绘制一行/列/单元格

在本例中,单击按钮更改行的背景色,然后调用“重新绘制”

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

一种方法是存储模型中每行的当前颜色。下面是一个固定为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);
    }
}
更改行的颜色非常简单,如下所示:

model.setRowColour(1, Color.YELLOW);

GetTableCellRenderComponent(…)
的调用包括为其寻找渲染器的单元格的值

可以使用该值计算颜色。如果还使用AbstractTableModel,则可以向渲染器提供任意类型的值


一旦有了颜色,就可以对要返回的组件使用
setBackground()

这里给出的其他答案效果很好,因为您在每一列中都使用相同的渲染器


但是,我倾向于认为,通常在使用JTable时,每个列中都会有不同类型的数据,因此不会对每个列使用相同的渲染器。在这些情况下,您可能会发现这种方法很有帮助。

请参阅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;
    }
});

我同意。在我看来,
TableModel
应该保存表数据。渲染应该在其他地方执行。链接的文章很有启发性,谢谢!)你是对的,这是有效的,但为什么这只适用于前5列?有什么想法吗?@Sahan,因为在第5列之后可能会有一个自定义单元格渲染器。我尝试了这个olivier,但在我使用了上面的代码之后,效果是我无法使用。setSelectionBackground(Color.yellow);再(@gumuruh)您也可以使用提供的isSelected参数在渲染器中设置选择颜色
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;
    }
});