在JTable-Java Swing中设置每一行的颜色



我想根据之前的计算将JTable的每一行的颜色设置为不同的颜色。然而,计算是正确的,它用正确的颜色激发了我自己编写的setRowColor()方法,但整张表的颜色都被设置了。

因此,如果最后一个元素是橙色的,那么整个表将被设置为橙色,尽管setRowColor()方法会用另一种颜色调用。任何其他颜色也是如此。你可以在控制台输出上看到这一点:

Row 0: White
Row (0) & Cell (0) to java.awt.Color[r=255,g=255,b=255]
Row (0) & Cell (1) to java.awt.Color[r=255,g=255,b=255]
Row (0) & Cell (2) to java.awt.Color[r=255,g=255,b=255]

Row 1: Orange
Row (1) & Cell (0) to java.awt.Color[r=255,g=200,b=0]
Row (1) & Cell (1) to java.awt.Color[r=255,g=200,b=0]
Row (1) & Cell (2) to java.awt.Color[r=255,g=200,b=0]

它总是将整个表格设置为调用的最后一种颜色!为什么会这样?我该如何解决?这是我的代码:

private void setRowColor(int row, Color color){
for (int i = 0; i < 3; i++) {
TableCellRenderer tableCellRenderer = sellTable.getCellRenderer(row, i);
Component c = sellTable.prepareRenderer(tableCellRenderer, row, i);
c.setBackground(color);
System.out.println("Row (" + row + ") & Cell (" + i + ") to " + color.toString());
}
System.out.println();
System.out.println();
}

,但整个表的颜色都已设置。

相同的渲染器用于表中相同数据类型的所有单元格。因此,不能提前设置渲染器的"颜色"。渲染每个单元时需要设置颜色。

我想根据计算将JTable的每一行的颜色设置为不同的颜色

该计算应添加到渲染过程中。如果行中的数据发生更改,这将允许对行进行动态着色。

一个简单的方法是覆盖表的prepareRenderer(...)方法。这种方法的一个简单示例是:

JTable table = new JTable( model )
{
public Component prepareRenderer(TableCellRenderer renderer, int row, int column)
{
Component c = super.prepareRenderer(renderer, row, column);
//  Alternate row color
if (!isRowSelected(row))
c.setBackground(row % 2 == 0 ? getBackground() : Color.LIGHT_GRAY);
return c;
}
};

有关详细信息和基于每行中的数据高亮显示行的示例,请查看"表行渲染"。

只有将背景色作为数据模型的一部分,也就是说,每个单元格中的每个值都应该包含显示值和背景色,这才有可能。然后,您需要创建并添加一个TableCellRenderer(如果表是可编辑的,则为TableCellEditor(来呈现数据。

例如,如果您将每个数据元素指定为简单的Object[]{color, string}(不推荐使用;最好创建一个不可变的容器类(,那么您就可以这样做:

(修改自https://docs.oracle.com/javase/tutorial/uiswing/components/table.html#renderer)

public class ColorTextRenderer extends JLabel implements TableCellRenderer {
public ColorTextRenderer() {
setOpaque(true); //MUST do this for background to show up.
}
public Component getTableCellRendererComponent(
JTable table, Object value,
boolean isSelected, boolean hasFocus,
int row, int column) {
setBackground((Color)((Object[])value)[0]);
setText     ((String)((Object[])value)[1]);
return this;
}
}

这里有一个小例子,介绍如何为每个单元格提供单独的颜色。您需要的是创建一个渲染器,它可以为每个单元定义颜色,并为所有单元设置颜色。

import java.awt.Color;
import java.awt.Component;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.WindowConstants;
import javax.swing.table.DefaultTableCellRenderer;
/**
* <code>ColoredRenderer</code>.
*/
public class ColoredRenderer {
public static void main(String[] args) {
ColorRenderer renderer = new ColorRenderer();
renderer.setColorForCell(0, 0, Color.YELLOW);
renderer.setColorForCell(1, 0, Color.CYAN);
renderer.setColorForCell(2, 0, Color.GRAY);
renderer.setColorForCell(3, 0, Color.BLUE);
renderer.setColorForCell(4, 0, Color.GREEN);
JTable table = new JTable(10, 5);
// set my renderer for all cells. 
table.setDefaultRenderer(Object.class, renderer); 
// Probably in your code you need to set it for each column by using
// table.getColumnModel().getColumn(columnIndex).setCellRenderer(renderer);
JFrame frm = new JFrame("Color test");
frm.add(new JScrollPane(table));
frm.pack();
frm.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frm.setLocationRelativeTo(null);
frm.setVisible(true);
}
private static class ColorRenderer extends DefaultTableCellRenderer {
private final Map<String, Color> colorMap = new HashMap<>();
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row,
int column) {
setBackground(null);
super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
getColorForCell(row, column).ifPresent(this::setBackground);
return this;
}
public void setColorForCell(int row, int col, Color color) {
colorMap.put(row + ":" + col, color);
}
public Optional<Color> getColorForCell(int row, int col) {
return Optional.ofNullable(colorMap.get(row + ":" + col));
}
}
}

附言:我在这里使用了一些Java8功能(可选+方法参考(。如果需要的话,我可以在没有这些功能的情况下重写这段代码。

最新更新