2016-06-30 2 views
1

Я изучаю 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 = "" 
      } 
     } 
     } 
    } 
+1

Я не знаю ScalaFX на всех, но ваш код выглядит странно. Обычно, когда вы подклассифицируете ячейку, вы переопределяете [updateItem] (https://docs.oracle.com/javase/8/javafx/api/javafx/scene/control/Cell.html#updateItem-T-boolean-), и вы следуете код, как указано в связанной ячейке Javadoc (invoke super.updateItem и включить логику для обработки пустых или нулевых ячеек во время обновления), неспособность сделать это правильно обычно приводит к поведению, например, вы упоминаете: «все еще были старые файлы в список". – jewelsea

+0

Иногда яснее просто использовать Java. Я пишу JavaFX из Scala, и иногда требуется некоторое время, чтобы понять, как это делается на Java, как это делается в Scala. Только один раз до этого мне пришлось расширять класс на Java, но вы почти всегда можете использовать функцию. – Bday

ответ

0

Это было очень странно, но я сделал это:

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) 
     } 
    } 
    }) 
} 
+0

Это круто! Однако это не должно быть так много. – Bday

+0

В итоге я отказался от scalaFX. Эти вещи, которые должны быть маленькими деталями, оказываются большими проблемами, другие вещи, которые больше работают на FX, делают это легко. Это просто не так много, чтобы написать FX в Scala. Мне понравилось, как scalaFX организует код в гораздо более похожий на Scala шаблон. FX заставляет вас использовать такую ​​же сложную, процедурную конфигурацию элементов, что и Swing. – Bday