9

私は従来の JavaTableCellRendererアプローチを使用し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])
   }
}

残念ながら、これにはメモリ リークがあるようです。おそらく、テーブル内のすべてのセルに対して新しい Component インスタンスを作成しているためです (約 30k 行)。確かに、scala テーブルをJTable(まったく同じデータモデルを使用して) に置き換えると、メモリ リークがなくなります。

rendererComponentしたがって、私の質問は、独自のセルレンダラーがあると仮定してメソッドをオーバーライドするときに、どのようなコードを使用するのですか?

4

2 に答える 2

1

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
}

likeを使用する(少なくとも「構成」はなくなりました...)

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
  }
}
于 2012-01-12T22:53:36.140 に答える