【问题标题】:Set color of each row in JTable - Java Swing设置 JTable 中每一行的颜色 - Java Swing
【发布时间】:2019-05-09 06:27:14
【问题描述】:

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

    }

【问题讨论】:

标签: java swing jtable awt


【解决方案1】:

但是整张桌子的颜色都设置好了。

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

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

查看Table Row Rendering 了解更多信息以及根据每行中找到的数据突出显示行的示例。

【讨论】:

  • @Jan,我不知道你不明白什么。我为您提供了一个链接,该链接提供了更多解释,并且您可以下载和测试代码。如果您对下载的代码有具体问题,请提出。
【解决方案2】:

只有将背景颜色作为数据模型的一部分才有可能,也就是说,每个单元格中的每个值都应该包含显示值和它的背景颜色。然后你需要创建并添加一个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;
    }
}

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 我真的不明白代码即使我是一个相当高级的程序员。我已经有一张桌子,我的值已经设置好了。我只是想改变背景。
    猜你喜欢
    • 2012-04-18
    • 2019-05-22
    • 1970-01-01
    • 2011-04-02
    • 2014-03-11
    • 2023-03-04
    • 1970-01-01
    • 2010-11-06
    • 1970-01-01
    相关资源
    最近更新 更多