Javafx 具有自定义ListCell的ListView
我正在学习scalaFX/JavaFX,作为一个热身,作为一个更大项目的一部分,我正在编写一个远程文件选择器。将Javafx 具有自定义ListCell的ListView,javafx,scalafx,Javafx,Scalafx,我正在学习scalaFX/JavaFX,作为一个热身,作为一个更大项目的一部分,我正在编写一个远程文件选择器。将列表视图绑定到可观察缓冲[文件]。但是我不想将File.toString作为文本,所以我想使用ListCell而不是扩展File。我没有找到任何这样的例子,所以我想我应该发布这个 这没关系,但我得到了Null文件,然后跳过Nulls时,列表中仍然有旧文件(如果更改前有x个文件,更改后有x个文件,则单元格中有旧数据) 最后,我为空文件添加了”,并从列表视图中删除了缺少的文件项。在List
列表视图
绑定到可观察缓冲[文件]
。但是我不想将File.toString
作为文本,所以我想使用ListCell
而不是扩展File
。我没有找到任何这样的例子,所以我想我应该发布这个
这没关系,但我得到了Null
文件,然后跳过Null
s时,列表中仍然有旧文件(如果更改前有x个文件,更改后有x个文件,则单元格中有旧数据)
最后,我为空文件添加了”
,并从列表视图中删除了缺少的文件项。在ListView
API中,我看不到有人提到这一点
你觉得这样对吗?在我看来,应该有另一个地方来移除细胞。默认的cellFactory
处理得很好
val fileList = new ListView[File](fileSystemModel.fileList) {
cellFactory = { _ =>
new ListCell[File] {
item.onChange {
(_, _, file) =>
if (file != null) {
text = s"${file.getName}${if (file.isDirectory) "/" else ""}"
} else text = ""
}
}
}
}
这非常奇怪,但我做到了:
import javafx.scene.{control => jfxsc}
case class Item(name: String)
items = ... //ListView[Item]
items.cellFactory = (lv: ListView[Item]) => {
new ListCell(new jfxsc.ListCell[Item] {
override def updateItem(item: Item, empty: Boolean): Unit = {
if (empty || item == null) {
setText(null)
setGraphic(null)
} else {
setText(item.name)
}
}
})
}
这非常奇怪,但我做到了:
import javafx.scene.{control => jfxsc}
case class Item(name: String)
items = ... //ListView[Item]
items.cellFactory = (lv: ListView[Item]) => {
new ListCell(new jfxsc.ListCell[Item] {
override def updateItem(item: Item, empty: Boolean): Unit = {
if (empty || item == null) {
setText(null)
setGraphic(null)
} else {
setText(item.name)
}
}
})
}
我一点也不知道ScalaFX,但是你的代码看起来很奇怪。通常,当您对覆盖的单元格进行子类化,并遵循链接单元格Javadoc中概述的代码模式(调用super.updateItem并在更新过程中包含处理空单元格或空单元格的逻辑)时,如果未能正确执行此操作,通常会导致出现您提到的行为:“列表中仍有旧文件”.有时,仅仅使用Java就更清楚了。我正在从Scala编写JavaFX,有时需要一段时间才能从Java如何实现到Scala如何实现。到目前为止,我只有一次用Java扩展了一个类,你几乎总是可以给我们一个函数。我一点也不知道ScalaFX,但是你的代码看起来很奇怪。通常,当您对覆盖的单元格进行子类化,并遵循链接单元格Javadoc中概述的代码模式(调用super.updateItem并在更新过程中包含处理空单元格或空单元格的逻辑)时,如果未能正确执行此操作,通常会导致出现您提到的行为:“列表中仍有旧文件”.有时,仅仅使用Java就更清楚了。我正在从Scala编写JavaFX,有时需要一段时间才能从Java如何实现到Scala如何实现。到目前为止,我只有一次用Java扩展了一个类,你几乎总是可以给我们一个函数。这些应该是小细节的事情变成了大问题,其他的事情更容易在FX中工作。用Scala编写FX并没有那么繁琐。我确实喜欢scalaFX将代码组织成更像Scala的模式的方式。FX强制您使用与Swing相同的详细的、过程化的元素配置。最后我放弃了scalaFX。这些应该是小细节的事情变成了大问题,其他的事情更容易在FX中工作。用Scala编写FX并没有那么繁琐。我确实喜欢scalaFX将代码组织成更像Scala的模式的方式。FX强制您使用与Swing相同的详细的、过程化的元素配置。