gpt4 book ai didi

swing - Scala中的惯用表格单元渲染器

转载 作者:行者123 更新时间:2023-12-04 04:01:31 27 4
gpt4 key购买 nike

我一直在使用传统的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])
}
}

不幸的是,这似乎存在内存泄漏-大概是因为我正在为表中的每个单元(约3万行)创建一个新的Component实例。当然,当我将scala表替换为 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 的实例转换为由 Tuple2String组成的 Icon,以显示该标签:
val ltcr = new LabelRenderer[MyObj] ( (o: MyObj) => (null, o.toString)  )

关于swing - Scala中的惯用表格单元渲染器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1195013/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com