更改单元格颜色而不更改其他单元格中的颜色(Jtable)

所以说我们有一个31列10行的JTable。 我想将2列4行的颜色更改为红色。 在我这样做之后,改变另一种细胞颜色而不会失去我之前细胞的颜色。

我试过以下但没有成功:

public class CellR extends DefaultTableCellRenderer { public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { setForeground(Color.white); if(row == TestHotel.v.getRow() && column == TestHotel.v.getCol()){ // Only for specific cell // c.setFont(/* special font*/); // you may want to address isSelected here too setForeground(Color.BLACK); setBackground(Color.RED); } return this; } 

如果我第一次调用渲染器…但如果我想改变另一种细胞颜色,我就会失去第一种颜色。

表格和列表中的单元格渲染器用作“图章”。 一个组件用于绘制所有单元格。 另请参阅概念:编辑器和渲染器 。 如果要保留有关“突出显示”单元格的信息,则必须以某种方式存储它们。

一个例子(根据评论扩展):

 import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; import java.awt.Point; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.HashMap; import java.util.Map; import java.util.Random; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.SwingUtilities; import javax.swing.table.DefaultTableCellRenderer; import javax.swing.table.TableColumn; import javax.swing.table.TableColumnModel; public class CellRendererTest { public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { createAndShowGUI(); } }); } private static void createAndShowGUI() { JFrame f = new JFrame(); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); String[] columnNames = { "First Name", "Last Name", "Sport" }; Object[][] data = { {"Kathy", "Smith", "Snowboarding" }, {"John", "Doe", "Rowing" }, {"Sue", "Black", "Knitting"}, {"Jane", "White", "Speed reading"}, {"Joe", "Brown", "Pool"} }; final JTable table = new JTable(data, columnNames); final ColoringCellRenderer cellRenderer = new ColoringCellRenderer(); TableColumnModel columnModel = table.getColumnModel(); int cc = columnModel.getColumnCount(); for (int c=0; c cellColors = new HashMap(); void setCellColor(int r, int c, Color color) { if (color == null) { cellColors.remove(new Point(r,c)); } else { cellColors.put(new Point(r,c), color); } } private Color getCellColor(int r, int c) { Color color = cellColors.get(new Point(r,c)); if (color == null) { return Color.WHITE; } return color; } @Override public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { super.getTableCellRendererComponent( table, value, isSelected, hasFocus, row, column); Color color = getCellColor(row, column); setBackground(color); return this; } } 

编辑:剩下的部分来自原始答案,仅使用单个单元格颜色。 上面的新版本更完整(function更强大,因为它可以模拟单色渲染器),但为了完整起见,我会留在这里

这可以通过像这样的渲染器来实现:

 class ColoringCellRenderer extends DefaultTableCellRenderer { private final Set highlightedCells = new HashSet(); void setHighlighted(int r, int c, boolean highlighted) { if (highlighted) { highlightedCells.add(new Point(r,c)); } else { highlightedCells.remove(new Point(r,c)); } } private boolean isHighlighted(int r, int c) { return highlightedCells.contains(new Point(r,c)); } public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { if (isHighlighted(row, column)) { setForeground(Color.BLACK); setBackground(Color.RED); } else { setForeground(Color.BLACK); setBackground(Color.WHITE); } return this; } } 

然后,您可以创建此渲染器的实例,并添加或删除要突出显示的单元格:

 ColoringCellRenderer r = new ColoringCellRenderer(); // Assign renderer to table... ... // Later, highlight cells: r.setHighlighted(4,2,true); r.setHighlighted(6,1,true); r.setHighlighted(1,5,false); ... 

如果要为单元格使用不同的颜色,可以使用Set特定Point (表示单元格的行/列)映射到Color对象的Map替换Set

您需要在要打开的列上设置单元格渲染器。

如果您要将第2列第4列的单元格颜色设置为红色,则应在第4列上设置渲染器。 您甚至可以在所有列上设置渲染器。

然后你要做的就是对行进行if-check。 即。 if(row == 4)。 但我假设您将从TestHotel.v对象获取您的值。