oxb*_*kes 9 swing scala jtable tablecellrenderer
我一直在使用传统的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])
}
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,这似乎有内存泄漏 - 大概是因为我正在为表中的每个单元创建一个新的Component实例(大约30k行).当然,当我用一个JTable(使用完全相同的列和数据模型)替换我的scala表时,我的内存泄漏就消失了.
因此,我的问题是,当重写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)
}
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,prepare您将在自己的渲染器类上定义一个方法:
class MyRenderer extends Label {
def prepare(o: MyObj) {
text = o.toString //or whatever
}
}
Run Code Online (Sandbox Code Playgroud)
然后通过覆盖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)
}
}
}
Run Code Online (Sandbox Code Playgroud)
Scala带有自己的实现AbstractRenderer,即将LabelRenderer函数作为参数,将MyObj的实例转换Tuple2为由a String和a 组成Icon,用于显示的标签:
val ltcr = new LabelRenderer[MyObj] ( (o: MyObj) => (null, o.toString) )
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1893 次 |
| 最近记录: |