如何保持JTable自定义渲染器在窗口大小调整?

时间:2017-06-18 21:20:14

标签: java swing jtable window-resize tablecellrenderer

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

enter image description here

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

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

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

enter image description here

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

2 个答案:

答案 0 :(得分:6)

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

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

否则渲染器将保持“设置”状态,并将所有单元格为灰色/白色。想象一个渲染器就像一个橡皮图章,用来摧毁很多相同的东西。如果更改它的颜色并且不更改它们,则图章会在颜色模式下“卡住”。

答案 1 :(得分:3)

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

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

查看Table Row Rendering以获取更多信息以及此方法的示例。