(J)尽管已启用自动行分类器并使用可比数据,但表仍未排序

0__*_*0__ 2 java swing scala jtable tablerowsorter

我无法使以下Swing表视图可以排序.虽然我确实在列标题翻转时得到了小三角形,但是根据排序状态,表内容不会有任何不同的刷新:

import scala.swing._

val data = Array(
  Array("a", 4, 8.9),
  Array("b", 7, 2.3),
  Array("c", 1, 5.6)
).map(_.map(_.asInstanceOf[AnyRef]))

val m = new javax.swing.table.DefaultTableModel(data, 
  Array[AnyRef]("string", "int", "double")) {

   override def getColumnClass(c: Int): Class[_] = c match {
     case 0 => classOf[java.lang.String ]
     case 1 => classOf[java.lang.Integer]
     case 2 => classOf[java.lang.Double ]
   }
}

val t = new Table
t.model = m
t.peer.setAutoCreateRowSorter(true)

new Frame {
  contents = new ScrollPane(t)
  pack().centerOnScreen()
  open()
}
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

我用不同的外观(截图显示Nimbus)和JDK(OpenJDK 6,OpenJDK 7)测试了这个.此外,我有一个自定义的树表组件,没有问题排序,所以错误必须在上面的某处.

0__*_*0__ 5

这是Scala-Swing中的一些错误.为什么我不感到惊讶?!

import scala.swing._

type I = java.lang.Integer
type D = java.lang.Double

val data = Array[Array[Object]](
  Array("a", 4:I, 8.9:D),
  Array("b", 7:I, 2.3:D),
  Array("c", 1:I, 5.6:D)
)

val m = new javax.swing.table.DefaultTableModel(data, 
  Array[AnyRef]("string", "int", "double")) {

  override def getColumnClass(c: Int): Class[_] = data(0)(c).getClass
}

val tj = new javax.swing.JTable(m)  // !!!
tj.setAutoCreateRowSorter(true)
val t = Component.wrap(tj)          // !!!

new Frame {
  contents = new ScrollPane(t)
  pack().centerOnScreen()
  open()
}
Run Code Online (Sandbox Code Playgroud)

可能是这个错误虽然标题说列排序受到影响(文本建议提交者正在讨论行排序).我的猜测是渲染器包装在viewToModel/中被破坏了modelToView.


编辑:确认.所需要的只是

val t = new Table {
  // disable broken renderer
  override lazy val peer: JTable = new JTable with SuperMixin
}
Run Code Online (Sandbox Code Playgroud)