Scala中惯用的表格的单元格渲染
-
19-09-2019 - |
题
我一直在使用传统的Java TableCellRenderer
方法对在我宣布在桌子上的scala.swing.Table
我的渲染器TableColumnModel
提供渲染。造成这种情况的代码看起来像:
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])
}
}
不幸的是,这似乎有内存泄漏 - 大概是因为我创建为表中的每一个细胞的新组件实例(〜30K行)。当然,当我与JTable
取代我阶表(使用完全相同的列和数据型号)我的内存泄漏会消失。
我的问题因此,什么样的代码重写rendererComponent
方法时假设一个拥有者自己的单元格渲染?
解决方案
使用Scala的表的单元格渲染的惯用方法是使用Table.AbstractRenderer
(如果实现自己的)或它的子类中的一个:
val tcr = new Table.AbstractRenderer[MyObj, MyRenderer](new MyRenderer) {
def configure(t: Table, sel: Boolean, foc: Boolean, o: MyObj, row: Int, col: Int) = {
//component variable is bound to your renderer
component.prepare(o)
}
}
在这种情况下prepare
是你定义你自己的渲染器类中的方法:
class MyRenderer extends Label {
def prepare(o: MyObj) {
text = o.toString //or whatever
}
}
然后这用于通过重写rendererComponent
方法上Table
:
val t = new Table {
override def rendererComponent(sel: Boolean, foc: Boolean, row: Int, col: Int) = {
//FIND VALUE
val v = model.getValueAt(
peer.convertRowIndexToModel(row),
peer.convertColumnIndexToModel(row))
col match {
case 0 => tcr.componentFor(this, sel, foc, v, row, col)
}
}
}
Scala的带有自己AbstractRenderer
的实施方式中,即LabelRenderer
这需要一个函数作为参数,转换的一个实例的 MyObj中以由Tuple2
和String
的Icon
,该标签显示:
val ltcr = new LabelRenderer[MyObj] ( (o: MyObj) => (null, o.toString) )
其他提示
由于一吨您例如oxbow_lakes!
恕我直言,这斯卡拉-事情变得丑如表渲染所能得到。 试图掩盖它尽可能...
class TableRenderer[A](comp: TableRendererComp[A]) extends Table.AbstractRenderer[A,TableRendererComp[A]](comp) {
def configure(t: Table, sel: Boolean, foc: Boolean, a: A, row: Int, col: Int): Unit =
component.render(a, sel, foc)
}
trait TableRendererComp[A] extends Component {
def render(a: A, sel: Boolean, foc: Boolean): Unit
}
使用类似的(至少在 “配置” 消失...)
val tcr = new TableRenderer[MyObj](new MyRenderer)
class MyRenderer extends Label with TableRendererComp[MyObj] {
def render(o: MyObj, sel: Boolean, foc: Boolean) {
text = o.toString //or whatever
}
}
不隶属于 StackOverflow