【问题标题】:JTable Custom Renderer not changing colorsJTable 自定义渲染器不改变颜色
【发布时间】:2021-10-05 19:09:54
【问题描述】:

我正在尝试编写一个自定义渲染器来根据里面的值更改我的 JTable 中的文本颜色。

这是我到目前为止的代码。我试图在不实际更改代码的情况下尽可能地简化它:

import javax.swing.*;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;
import java.awt.*;

public class Main {

public static String[][] resultsArray;
public static JTable results;
public static JScrollPane resultScrollPane;

public static void main(String[] args) {
    resultsArray = new String[][]{{"123456", "192.168.4.16", "3.4/01.73.10", "1x6216", "109986 MB", "Fail", "2xSSD480", "6xHDD2GB", "Fail", "Fail"}};

    resultScrollPane = new JScrollPane();
    JFrame f = new JFrame("Table with colors");
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.setLayout(new BorderLayout());
    f.add(resultScrollPane,BorderLayout.CENTER);
    f.setSize(new Dimension(60,255));

    setTableResults(resultsArray);

    f.setVisible(true);
}

public static void setTableResults(String[][] result) {
    Object[] columnNames = {
            "Serial Number",
            "IP Address",
            "BIOS/IPMI-Firmware",
            "CPUs",
            "Memory",
            "DCMS",
            "SSDs",
            "HDDs",
            "Network AOC",
            "AOC"
    };
    TableModel model = new DefaultTableModel(result, columnNames);
    results = new JTable(model);
    results.setDefaultRenderer(String.class, new DefaultTableCellRenderer() {
        @Override
        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
            Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
            String data = (String) value;
            switch (column) {
                case 0, 1 -> c.setForeground(Color.BLACK);
                case 2 -> c.setForeground((data.contains("3.4") && data.contains("01.73.10")) ? Color.BLACK : Color.RED);
                case 3 -> c.setForeground((data.split("x")[0].equalsIgnoreCase("2")) ? Color.BLACK : Color.RED);
                case 4 -> c.setForeground((Integer.parseInt(data.split(" ")[0]) == 200000) ? Color.BLACK : Color.RED);
                case 5 -> c.setForeground((data.equalsIgnoreCase("ok")) ? Color.BLACK : Color.RED);
                case 6 -> c.setForeground((Integer.parseInt(data.split("x")[0]) == 2) ? Color.BLACK : Color.RED);
                case 7 -> c.setForeground((Integer.parseInt(data.split("x")[0]) == 6) ? Color.BLACK : Color.RED);
            }
            return c;
        }
    });
    resultScrollPane.setViewportView(results);
    results.repaint();
    }
}

问题在于,代码实际上不起作用。所有单元格都有标准的黑色字体颜色。我尝试添加 .repaint() 以确保 JTable 在显示之前得到更新,但这并没有改变任何东西。

有人知道我的问题是什么吗?

【问题讨论】:

    标签: java swing jtable tablecellrenderer


    【解决方案1】:

    默认情况下,与列关联的类是Object,在getColumnClass() 的文档中指定:

    无论 columnIndex 是什么,都返回 Object.class。

    因此,您可以像这样更改代码以使其正常工作:

    results.setDefaultRenderer(Object.class, new DefaultTableCellRenderer() {
    

    【讨论】:

    • 太棒了,谢谢!现在它按预期工作。我知道它一定很简单,但就是不知道它是什么。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-23
    • 1970-01-01
    • 2013-01-30
    • 2011-10-02
    • 2020-11-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多