我正在开发一个简单的UI,它有一个scala.swing.Table组件。我想使用java.swing.table.TableRowSorter对表格行进行排序。table类没有提供任何用于使用行排序器的API,所以我尝试直接在对等上设置它
val table = new Table(height, width) {
import javax.swing.table._
rowHeight = 25
autoResizeMode = Table.AutoResizeMode.NextColumn
showGrid = true
gridColor = new java.awt.Color(150, 150, 150)
model = myModel
peer.setRowSorter(new TableRowSorter(model))
}
现在,当我点击列标题时,我会看到小的向上/向下箭头,但表内容不会随着新的排序顺序而更新。如果在单击列标题时选择了一行,则所选内容将根据排序顺序移动到所选内容所在的行。我添加了自定义比较器,它们按预期调用,所以排序确实在进行,但表没有更新。
我是不是错过了一些更新表格的内容?访问底层JTable对等对象是否合法?
回答我自己的问题。
scala.swing.Table类不支持Java 6中添加的行排序功能。请参阅第277行的Table.scala源文件:
def apply(row: Int, column: Int): Any = model.getValueAt(row, viewToModelColumn(column))
// TODO: this is Java 6 stuff
// def apply(row: Int, column: Int): Any = model.getValueAt(viewToModelRow(row), viewToModelColumn(column))
//def viewToModelRow(idx: Int) = peer.convertRowIndexToModel(idx)
//def modelToViewRow(idx: Int) = peer.convertRowIndexToView(idx)
我将scala.swing文件移到另一个包中,并将其构建到我的项目中,然后取消Java 6的注释,并注释掉旧的apply()方法,现在表排序就可以工作了。
这里有一个关于这个错误报告的链接。Java 6代码在8月份被添加,然后被删除,直到Scala库构建切换到Java 6。