【问题标题】:How to keep JTable custom renderer looks on window resize?如何在窗口调整大小时保持 JTable 自定义渲染器的外观?
【发布时间】:2017-11-21 00:35:57
【问题描述】:

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

我通过自定义渲染器的以下代码实现了这一点:

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;
    }
});

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

为了让它恢复正常,我必须清除表格并再次添加项目,我应该怎么做才能在调整大小时保持表格的外观?谢谢。

【问题讨论】:

    标签: java swing jtable window-resize tablecellrenderer


    【解决方案1】:

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

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

    否则,渲染器将保持“设置”状态,并将所有单元格着色为灰色/白色。将渲染器想象成橡皮图章,用于消除许多相同的事物。如果您更改了它的颜色并且不将它们改回,则该图章将“卡在”颜色模式中。

    【讨论】:

    • 谢谢你的工作!我会在 5 分钟内接受你的回答,因为堆栈溢出现在不允许我接受。
    • @AlexandreKrabbe:首先批判性地看待 camickr 始终出色的建议。我对他的回答投了 1+ 票。
    【解决方案2】:

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

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

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

    【讨论】:

    • 感谢您提供的信息,我会研究一下。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-20
    • 1970-01-01
    • 1970-01-01
    • 2018-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多