J'avais utilisé l'approche traditionnelle Java TableCellRenderer
pour fournir les moteurs de rendu dans un scala.swing.Table
où je déclare mes moteurs de rendu sur la table TableColumnModel
. Le code de cette ressemblait:Rendeurs de cellules de table idiomatiques dans 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])
}
}
Malheureusement, cela semble avoir une fuite de mémoire - sans doute parce que je suis en train de créer une nouvelle instance de composants pour toutes les cellules de la table (pour les lignes de ~ 30K). Certes, quand je remplace ma table de scala avec un JTable
(en utilisant exactement la même colonne et données modèles) ma fuite de mémoire disparaît.
Ma question est donc de savoir quel type de code les gens utilisent-ils en surchargeant la méthode rendererComponent
en supposant que l'on possède ses propres moteurs de rendu?
Je pense que vous voulez 'peer.convertColumnIndexToModel (col) 'à la place de' peer.convertColumnIndexToModel (row) ' –
Vous pouvez également utiliser' scala.swing.Table.viewToModelColumn (Int): Int'. Notez bien pourquoi il n'y a pas de méthode wrapper équivalente pour les lignes. –