在JTable-javaswing中设置每行的颜色

在JTable-javaswing中设置每行的颜色,java,swing,jtable,awt,Java,Swing,Jtable,Awt,我想根据之前的计算将JTable中每一行的颜色设置为不同的颜色。但是,计算是正确的,它使用正确的颜色触发了我自己编写的setRowColor()方法,但设置了整个表的颜色 因此,如果最后一个元素是橙色,则整个表将设置为橙色,尽管使用另一种颜色调用setRowColor()方法。其他颜色也一样。您可以在这里的控制台输出上看到: Row 0: White Row (0) & Cell (0) to java.awt.Color[r=255,g=255,b=255] Row (0) &

我想根据之前的计算将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();

    }
private void setRowColor(int行,颜色){
对于(int i=0;i<3;i++){
TableCellRenderer TableCellRenderer=sellTable.getCellRenderer(行,i);
组件c=sellTable.prepareRenderer(tableCellRenderer,行,i);
c、 挫折背景(颜色);
System.out.println(“行(“+Row+”)和单元格(+i+”)到“+color.toString());
}
System.out.println();
System.out.println();
}

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

例如,如果将每个数据元素指定为像
Object[]{color,string}
那样简单(不推荐;最好创建一个不可变的容器类),则可以避免此问题:

(修改自)


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

例如,如果将每个数据元素指定为像
Object[]{color,string}
那样简单(不推荐;最好创建一个不可变的容器类),则可以避免此问题:

(修改自)


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

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特性(可选+方法参考)。如果需要,我可以在没有这些功能的情况下重写此代码。

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

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特性(可选+方法参考)。如果需要,我可以在没有这些特性的情况下重写这段代码

但是整张桌子的颜色都定好了

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

我想根据计算结果将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;
    }
};
查看更多信息和基于每行中找到的数据的行高亮显示示例

但是整张桌子的颜色都定好了

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

我想根据计算结果将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;
    }
};

查看更多信息和基于每行数据的行高亮显示示例。

即使我是一名相当高级的程序员,我也不理解代码。。我已经有了一个表,并且我的值已经设置好了。。我只是想改变一下背景。我真的不懂代码,即使我是一个相当高级的程序员。。我已经有了一个表,并且我的值已经设置好了。。我只是想改变背景。@Jan,我不知道你不明白什么。我提供了一个链接,提供了更多的解释,还有一些代码可以下载和测试。如果你对下载的代码有什么特别的问题,那就去问它。@Jan,我不知道你有什么不懂的。我提供了一个链接,提供了更多的解释,还有一些代码可以下载和测试。如果您对下载的代码有特定问题,请询问。