如何保持 JTable 自定义呈现器在 window 调整大小时的外观?

How to keep JTable custom renderer looks on window resize?

我的 Java 应用程序中有一个 JTable,并应用了一个自定义渲染器来更改 table 最后一行的背景颜色。像这样:

我使用以下自定义渲染器代码实现了这一点:

table.setDefaultRenderer(Object.class, new DefaultTableCellRenderer(){
    @Override
    public Component getTableCellRendererComponent(JTable table,
            Object value, boolean isSelected, boolean hasFocus, int row, int col) {
                
        super.getTableCellRendererComponent(table, value, isSelected,
                                            hasFocus, row, col);
                
        String status = (String)table.getModel().getValueAt(row, 0);
        if ("Total".equals(status)) {
            setBackground(Color.GRAY);
            setForeground(Color.WHITE);
        } 
                
        this.setHorizontalAlignment(CENTER);
        return this;
    }
});

但是,当我调整 window 的大小时,它看起来像这样:

要恢复正常,我必须清除 table 并重新添加项目,我应该怎么做才能在调整大小时保持 table 外观?谢谢。

您忘记了 else 块来设置颜色:

if ("Total".equals(status)) {
    setBackground(Color.GRAY);
    setForeground(Color.WHITE);
} else {
    // set colors back to the default settings
    setBackground(null);
    setForeground(null);
}

否则渲染器保持 "set" 并且将为所有单元格着色 gray/white。将渲染器想象成一个橡皮图章,用来印出很多相同的东西。如果您更改了它的颜色并且没有将它们改回原来的颜色,则图章在颜色模式下为 "stuck"。

实际上,您不应该为 "Quantity" 和 "Price" 列存储字符串数据。相反,您应该存储 Integer 和 Double 值。所以这意味着您需要创建 3 个自定义渲染器。

另一种选择是覆盖 JTable 的 prepareRenderer(...) 方法来设置背景颜色。

查看 Table Row Rendering 了解更多信息和此方法的示例。