【问题标题】:JTable Clickable Column Sorting: Sorting sorts content of cells, but doesn't update cell formatting?JTable Clickable Column Sorting:对单元格内容进行排序,但不更新单元格格式?
【发布时间】:2012-04-25 17:50:37
【问题描述】:

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

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

thisJTable.setAutoCreateRowSorter(true);

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

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

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

通过覆盖 JTable 的默认 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) {
        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;
    }
};

【问题讨论】:

  • 我可能还需要确保在内容更新后将基于内容的格式化应用于行,但我还没有解决这个问题。我已经在覆盖 custTableModel.setValueAt(Object, int, int) 所以我认为我有很多选择,但我认为我也应该提到这一点。
  • 您的 prepareRenderer 什么都不做,并且与 CustTableModel thisModel = (CustTableModel) getModel(); 相冲突,删除它,Renderer is only about formating, change Color, etc,不适用于创建 JComponent,不要这样做
  • @kKorbel 我不确定我是否遵循您的评论。 getRowForeColor 和 getRowBackgroundColor 根据行的内容(因此传递 rowIdx)为行添加条件着色。我使用 super 方法来创建组件,然后简单地在该组件上设置正确的背景和前景色。我需要获取 TableModel 并将其转换为我的 CustTableModel,因为 getRow[Fore|Background]Color 不是其他表模型的定义方法。
  • 我很好奇 getRowBackgroundColor()) 的细节;里面的代码? @潘基

标签: java swing jtable abstracttablemodel


【解决方案1】:

你必须convert row index from View to the Model

int modelRow = convertRowIndexToModel(row);

【讨论】:

  • 该死,你打败了我(还在和我的新键盘作斗争:-)+1,当然
  • 太棒了!感谢您的提示,我已经查看 JTable 的 Javadoc 有一段时间了,但并没有以某种方式偶然发现这一点。
  • @Panky:“使用排序器时,请始终记住转换单元格坐标。”—Sorting and Filtering;可悲的是,我不得不多次查找它。 :-)
【解决方案2】:

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

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

【讨论】:

  • 我不敢相信这个答案不是公认的答案。如此优雅和简单。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-09-24
  • 2016-06-26
  • 1970-01-01
  • 2022-06-26
  • 1970-01-01
  • 2013-04-09
  • 1970-01-01
相关资源
最近更新 更多