【发布时间】: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