20

我有一个可排序的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;
    }
};
4

2 回答 2

19

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

int modelRow = convertRowIndexToModel(row);
于 2012-04-25T17:53:49.300 回答
4

您可以通过单击标题来启用表格排序 table.setAutoCreateRowSorter(true);

欲了解更多信息,请访问此网站http://www.codejava.net/java-se/swing/6-techniques-for-sorting-jtable-you-should-know

于 2016-05-01T19:50:59.700 回答