javafx cell和setcell工厂混淆

g2ieeal7  于 2021-07-03  发布在  Java
关注(0)|答案(1)|浏览(344)

我正在学习细胞和细胞工厂api的。我读过很多例子,我无法理解setcellfactory或setcellvaluesfactory实际上是如何工作的。
下面是scala中的示例(向java用户致歉):

1:

val cb = new javafx.util.Callback[ListView[Number], ListCell[Number]] {

    override def call(list: ListView[Number]): ListCell[Number] = {
        new MoneyFormatCell
    }
}

2:

class TranslationCell extends ListCell[String] {

    override protected def updateItem(item: String, empty: Boolean) {
        super.updateItem(item, empty)
        textProperty().unbind()

        if (empty || item == null) setText("") ?else textProperty().bind(createStringBinding(item))
    }
}

请忽略回调和translationcell类中的不同类型和登录名,它们在本例中不相关。
现在,如果我这样做,两个选项都起作用:

x.setCellFactory(cb)
y.setCellFactory(lv => new TranslationCell)

我不明白为什么 y 案例起作用 setCellFactory 需要一个 Callback[A] 以及 TranslationCell 延伸到 ListCell[B] .
我也不明白 updateItem 方法与函数以及如何传递 TranslationCellsetCellFactory 没有任何问题。
他们之间有什么关系 updateItem 以及 setCellFactory ?

o8x7eapl

o8x7eapl1#

这个 setCellFactory 方法需要 Callback<ListView<T>,ListCell<T>> ,即函数Map ListView<T>ListCell<T> . 在你发布的代码中,没有任何地方可以传递 ListCellsetCellFactory 方法。
这个 ListView 通过创建显示可见内容所需的任意多个单元格在内部工作。注意,由于 ListView 是可滚动的,这可能比 ListView . 这个 ListCell 通过调用 Callback 传递给 setCellFactory() 方法,以便创建所需的单元格数。通常,如果 ListView 大到足以显示,例如,10个单元格,它将调用单元格工厂的 Callback 至少10次(它可以创建一个或两个“备用”单元)。
为了实际显示单元格的内容 ListView 将呼叫每个手机的 updateItem() 方法,传入要显示的项(或 null ),以及表示此单元格是否为“空”的布尔值。实施 updateItem() 方法应基于 item 待显示。
在细胞寿命的不同阶段,可能会要求它显示不同的项目。例如,当用户在 ListView ,而不是为新显示的项目创建新的单元格并丢弃旧的单元格(这会在某个时候对垃圾收集器造成相当大的压力),而是 ListView 将简单地“重用”现有单元格,要求它们显示不同的项。这一点的实际实施(故意)没有定义;你只知道 updateItem() 方法将在单元格需要更新其显示时调用。
注意,这意味着 updateItem() 方法需要处理所有的可能性;它可以从空到非空,从非空到空,或者从显示一个项目到显示另一个项目。因此 updateItem() 方法必须在任何代码路径中设置文本和/或图形。如果您执行其他操作,例如更改样式,则应该在中的任何可能的代码路径中再次执行此操作 updateItem() 方法。

相关问题