我有一个可排序的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;
}
};
答案 0 :(得分:16)
你必须convert row index from View to the Model
int modelRow = convertRowIndexToModel(row);
答案 1 :(得分:2)
您可以使用此方法单击标题来启用表格排序
table.setAutoCreateRowSorter(true);
有关详细信息,请访问此网站http://www.codejava.net/java-se/swing/6-techniques-for-sorting-jtable-you-should-know