Идиоматические рендереры ячейки таблицы в Scala

Политика, которую я имею с такими ситуациями, состоит в том, чтобы передать stringlist содержание через текстовое свойство и просто передать строку, возвращенную к функции. Таким образом, там не является никакая потребность обсудить, кто выпускает кто. Конечно, необходимо сделать немного больше кодирования, но это более безопасно. Примером является адаптация одной Ken White:

var
  SL: TStringList;
  Aux: String;
begin
  SL := TStringList.Create;
  try
    SL.Text := ProcToFillStringList;
    //Do something with populated list
  finally
    SL.Free;
  end;
end;

 // It receives a default param, in the case you have to deal with 
 // StringList with some previous content    
 function ProcToFillStringList(SListContent: String = ''):String;
 // Do the stuff you need to do with the content
end;

исключение - когда все, что Вы имеете, является объектом и нет никакого способа получить содержание на нем через безопасный тип (в этом случае, строки); тогда я следую за идеей Ken White.

9
задан Jonas 26 December 2011 в 18:04
поделиться

1 ответ

Идиоматический способ использования средств визуализации ячеек таблицы 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
  }
}

Затем он используется путем переопределения компонента визуализации метод в таблице :

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 и ] Значок , для отображения этой метки:

val ltcr = new LabelRenderer[MyObj] ( (o: MyObj) => (null, o.toString)  )
8
ответ дан 4 December 2019 в 21:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: