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