JTable可点击列排序:排序对单元格的内容进行排序,但是不更新单元格格式吗?


问题内容

我有一个可排序的JTable设置,以使用的自定义扩展名AbstractTableModel。但是,该表的某些行为是我所期望的,并且我希望就如何弄清楚该表提供一些建议。

我已经将JTable设置为可以使用以下命令进行排序:

thisJTable.setAutoCreateRowSorter(true);

这使我可以按预期通过单击列标题对表进行排序。

但是,我发现当我通过单击列标题对表进行排序时,行的格式(背景和前景色)也没有进行排序。

我已经将这些行设置为根据它们包含的值进行颜色编码。当我按列标题排序时,给定行NUMBER的格式保持不变(尽管该行中先前的内容已移动)。

通过覆盖prepareRendererJTable 的默认调用来设置行的颜色:

thisTable = new JTable(thisModel){

    //Set up custom rendering - Sets background color of row to correct value
    public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
        Component c = super.prepareRenderer(renderer, row, column);
        CustTableModel thisModel = (CustTableModel) getModel();
        c.setBackground(thisModel.getRowBackgroundColor(row));
        c.setForeground(thisModel.getRowForeColor(row));
        return c;
    }
};

有没有更好/不同的方式来解决这个问题?

我是否应该使用其他方法进行渲染,该方法可以在某种程度上更新JTable的渲染?

还是我想研究编写自己的排序方法?

解决方案(谢谢mKorbel!)

我以为我会发布解决方案,因为我不确定如何将新索引也传递给prepareRenderer,因此我不得不花一点时间。

 thisTable = new JTable(thisModel){

    //Set up custom rendering - Sets background color of row to correct value
    public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {

        int viewIdx = row;
        int modelIdx = convertRowIndexToModel(viewIdx);
        Component c = super.prepareRenderer(renderer, row, column);
        CustTableModel thisModel = (CustTableModel) getModel();
        c.setBackground(thisModel.getRowBackgroundColor(modelIdx));
        c.setForeground(thisModel.getRowForeColor(modelIdx));
        return c;
    }
};

问题答案:

您必须将行索引从“视图”转换为“模型”

int modelRow = convertRowIndexToModel(row);