Я изучаю scalaFX/JavaFX, чтобы разогреться, а часть более крупного проекта, я пишу удаленный выбор файла. Связывание a ListView
с номером ObservableBuffer[File]
. Но я не хочу File.toString
в качестве текста, поэтому вместо расширения File
я хотел использовать ListCell
. Я не нашел примеров, которые сделали это, поэтому я решил, что опубликую это.ListView с пользовательским ListCell
Это было хорошо, но я получал файлы Null
, а затем, пропуская Null
, у меня все еще были старые файлы в списке (если перед изменением и x-after есть файлы x, у вас есть ячейки со старыми данными) ,
В конце я положил ""
для нулевых файлов, а отсутствующие элементы файла были удалены из ListView
. Я не вижу упоминания об этом в API ListView
.
Это похоже на вас? Мне кажется, что должно быть другое место для удаления клеток. По умолчанию это 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 = ""
}
}
}
}
Я не знаю ScalaFX на всех, но ваш код выглядит странно. Обычно, когда вы подклассифицируете ячейку, вы переопределяете [updateItem] (https://docs.oracle.com/javase/8/javafx/api/javafx/scene/control/Cell.html#updateItem-T-boolean-), и вы следуете код, как указано в связанной ячейке Javadoc (invoke super.updateItem и включить логику для обработки пустых или нулевых ячеек во время обновления), неспособность сделать это правильно обычно приводит к поведению, например, вы упоминаете: «все еще были старые файлы в список". – jewelsea
Иногда яснее просто использовать Java. Я пишу JavaFX из Scala, и иногда требуется некоторое время, чтобы понять, как это делается на Java, как это делается в Scala. Только один раз до этого мне пришлось расширять класс на Java, но вы почти всегда можете использовать функцию. – Bday