Ich hatte den traditionellen Java TableCellRenderer
Ansatz für die Bereitstellung der Renderer in einem scala.swing.Table
verwendet, wo ich meine Renderer auf der Tabelle TableColumnModel
deklarieren. Der Code für das sah aus wie:Idiomatische Tabellenzellen-Renderer in Scala
val myTable = new Table {
lazy val tcm = initColumnModel
peer.setColumnModel(tcm)
override
protected def rendererComponent(sel: Boolean, foc: Boolean, row: Int, col: Int) = {
//GET THE VALUE FROM THE TableModel
val value = model.getValueAt(
peer.convertRowIndexToModel(row),
peer.convertColumnIndexToModel(col))
//GET THE RENDERER FROM THE ColumnModel
val renderer = tcm.getColumn(col).getCellRenderer
//WRAP IN A COMPONENT
Component.wrap(renderer.getTableCellRendererComponent(
peer,
value,
sel,
foc,
row,
col).asInstanceOf[JComponent])
}
}
Leider ist dies ein Speicherleck zu haben scheint - vermutlich, weil ich in der Tabelle für jede Zelle eine neue Komponente Instanz erschaffe (für ~ 30k Zeilen). Sicherlich, wenn ich meine Scala-Tabelle durch eine JTable
(mit genau den gleichen Spalte und Daten Modelle ersetzt) mein Speicherleck verschwindet.
Meine Frage ist daher, welche Art von Code verwenden Menschen beim Überschreiben der rendererComponent
-Methode vorausgesetzt, man hat seine eigenen Cell-Renderer?
Ich glaube, Sie wollen 'peer.convertColumnIndexToModel (col) '' anstelle von 'peer.convertColumnIndexToModel (Zeile)' –
Sie können auch 'scala.swing.Table.viewToModelColumn (Int): Int' verwenden. Beachten Sie, warum es keine äquivalente Wrapper-Methode für Zeilen gibt. –