更改JTable中行的背景颜色

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

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

getTableCellRendererComponent()返回每行具有随机背景颜色的Component。
在程序运行时如何将背景更改为其他随机颜色?

一种方法是存储模型中每行的当前颜色。 这是一个固定在3列3行的简单模型:

 static class MyTableModel extends DefaultTableModel { List 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); 

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

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

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

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

在此示例中,单击按钮可更改行的背景颜色,然后调用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()