当前位置: 首页 > 知识库问答 >
问题:

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

严开宇
2023-03-14

我设置了一个可排序的JTable,以使用AbstractTableModel的自定义扩展。然而,这个表的某些行为正是我所期望的,我希望得到一些关于如何解决这个问题的建议。

我使用以下方法将JTable设置为可排序:

thisJTable.setAutoCreateRowSorter(true);

这允许我按预期单击列标题对表进行排序。

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

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

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

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

共有2个答案

阎知
2023-03-14

您可以使用此表格单击标题来启用表格排序。setAutoCreateRowSorter(真)

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

谭伟
2023-03-14

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

int modelRow = convertRowIndexToModel(row);
 类似资料:
  • 问题内容: 我有一个可排序的设置,以使用的自定义扩展名。但是,该表的某些行为是我所期望的,并且我希望就如何弄清楚该表提供一些建议。 我已经将JTable设置为可以使用以下命令进行排序: 这使我可以按预期通过单击列标题对表进行排序。 但是,我发现当我通过单击列标题对表进行排序时,行的格式(背景和前景色)也没有进行排序。 我已经将这些行设置为根据它们包含的值进行颜色编码。当我按列标题排序时,给定行NU

  • 当有空单元格时,我在对列进行排序时有问题。 我为我的列创建了一个新的: 一开始,它似乎很管用: 非常感谢Jai,我修改您的代码只是因为我想将其用于两个不同的列:

  • 我有一些困难,以确保我利用已排序的数据在一个配置单元表。(使用ORC文件格式) 我知道我们可以通过在create DDL中声明子句来影响数据从配置单元表中读取的方式。 这意味着每次查询该表时,数据将通过在各个映射器之间分发,然后对其进行排序。 我的问题是: 我不希望数据被拆分为文件(桶),因为卷不是那么多,我会保留小文件。 但是,我确实想利用排序插入。 我真的需要在create DLL语句中使用吗

  • 我有一个问题,我无法解决单独和帮助其他话题在那里。找到了一些相似的,但它没有帮助。 我的问题有点棘手,我想,我会尽力解释清楚。 因此,我得到了一个包含两列的JTable,列2和列3是可编辑的,列4是这两个列的乘积(col4=col2*col3)。我要做的是,当我编辑第2或第3列时,第4列将自动更新它的值。我理解这一点,但不完全理解。只有当我完成MouseClick编辑时单元格才会更新。如果编辑是通

  • 我有一个SWT,我将其与JFace一起使用。 我希望使用比较器对表格进行排序,该比较器与表格单元格中的文本一起工作,而不是与查看器中的模型元素一起工作。 这有什么好办法吗? 我尝试这样做是因为在单元格文本上对表格进行排序几乎在所有情况下都有效,并且它使我不必为我希望能够排序的每个模型对象属性创建单独的比较器。 问题是表通常使用查看器上设置的进行排序。其方法无法访问其参数元素在表中的位置: 使用在中

  • 我已经将BigDecimal属性的列添加到网格中,并希望对此类列进行排序可以开箱即用: 添加:如果不使用NumberRenderer并以正常方式添加列,那么setSortedProperty将按预期工作:

  • 我一直在试图找到一种通过直接输入来更新我的细胞的方法。从我的研究来看,每个人似乎都说你必须使用 尽管如此,它还是让我投myJTable-- 以下是我当前的表代码,如果这有帮助的话: 我怎么可能从用户直接输入更新的单元格中保存数据?谢谢!

  • 我在更新JTable的单元格值时遇到了一个问题。我想做的是在从JTable中选择一个特定的单元格之后,我应该能够进行编辑,并且该操作必须反映后端的数据库。我在用HSQL。我的表有4列,有一个PK。请给我一个替代和/或提供一些代码,替换的*。我是新来的,只是个初学者。