当前位置: 首页 > 面试题库 >

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

宓毅庵
2023-03-14
问题内容

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


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

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

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

  • 本文向大家介绍javascript实现对表格元素进行排序操作,包括了javascript实现对表格元素进行排序操作的使用技巧和注意事项,需要的朋友参考一下 我们在上网中都能看到很多能够排序的,如大小、时间、价格等 现在我们也试一下排序功能: 排序的函数代码:里面含有点击之后排序--还原,和排升序和降序。 设置表格的背景颜色代码,导入的css: css代码: 效果图-----排序之前: 升序: 降序

  • 问题内容: 我想具有重新排列表中的行的功能(使用拖放对行进行排序)。 并且行排列的索引在模型中也应更改。 如何 使用Angular Directive 做类似的事情:http : //jsfiddle.net/tzYbU/1162/? 我正在生成表为: 问题答案: 我做的。请参阅下面的代码。 的HTML 指令(JS)

  • 我有这个列表,我想在我的屏幕上按照时间[“time in”]对它进行排序。有人知道我该怎么做吗?