He estado utilizando el enfoque tradicional Java TableCellRenderer
para proporcionar los procesadores en un scala.swing.Table
donde declaro mis representadores en TableColumnModel
de la tabla. El código para esta parecía:Representadores de células de tabla idiomática en 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])
}
}
Desafortunadamente esto parece tener una pérdida de memoria - presumiblemente porque estoy creando una nueva instancia de componente para cada celda de la tabla (por filas ~ 30k). Ciertamente cuando reemplazo mi tabla scala con JTable
(usando exactamente la misma columna y data modelos) mi pérdida de memoria desaparece.
Mi pregunta es, por lo tanto, ¿qué tipo de código utilizan las personas cuando se reemplaza el método rendererComponent
suponiendo que uno tiene sus propios procesadores de células?
Creo que quieres 'peer.convertColumnIndexToModel (col) 'en lugar de' peer.convertColumnIndexToModel (fila) ' –
También puede usar' scala.swing.Table.viewToModelColumn (Int): Int'. Tenga en cuenta por qué no hay un método de envoltura equivalente para las filas. –