Впервые в JavaFX, я только что узнал, как установить фабрику значений ячеек с помощью Callback: в Groovy это выглядит так:
fxmlController.treeTableView.columns.get( 0 ).cellValueFactory =
new Callback<TreeTableColumn.CellDataFeatures, ObservableValue>() {
@Override
Binding call(TreeTableColumn.CellDataFeatures cellDataFeatures ) {
// NB it turns out that the first "value" is a TreeItem
Task task = cellDataFeatures.value.value
Bindings.createStringBinding( { task.title } )
}
}
... но что мне делать, если мой следующий столбец является столбцом значений LocateDate
/ LocateDateTime
? Нет метода stati c Bindings.createLocalDateTimeBinding()
...
Для записи, я думаю, мне нужно двунаправленное связывание, в том смысле, что я хочу, чтобы это отображалось, но я также хочу, чтобы пользователь мог редактировать.
Но, может быть, это не имеет к этому никакого отношения: я думаю о довольно сложных схемах редактирования JTree
элементов в компоненте Swing: editor, всего этого типа. Я пока не знаю, как это работает в JavaFX.
Edit
James_D дал мне несколько ценных подсказок, достаточных для отображения этих значений в ячейке. Редактирование оказывается немного сложнее. Моя первая попытка была такой:
dueDateCol.cellFactory = TextFieldTableCell.<Task>forTableColumn()
Это дает исключение и гигантский след стека на Stage.show()
:
Exception in thread "JavaFX Application Thread"
java.lang.ClassCastException: class java.time.LocalDate cannot be cast
to class java.lang.String (java.time.LocalDate and java.lang.String are
in module java.base of loader 'bootstrap')
Тогда я подумал, что, возможно, мне стоит попробовать "старую школу" Способ настройки редактора ячеек: я следовал инструкциям здесь , в разделе «Альтернативное решение редактирования ячеек».
Снова это не запускается (см. Трассировку стека ниже).
Очевидно, что для представления не строкового значения в ячейке его необходимо преобразовать в String
.. В данный момент я пытаюсь точно определить, где происходит исключение приведения класса. Это, вероятно, во внутренних органах TableCell
. Я также отмечаю, что это происходит до того, как редактор фактически вызывается в службу: т.е. во время «показа». Хмммм ...
Больше подробностей:
Несмотря на то, что я ловлю все Throwable
s, брошенные внутрь start()
, и не печатаю на консоль, некоторые внутренние данные все еще печатают следы стека в Терминал на show()
. Это начало этого:
Exception in thread "JavaFX Application Thread"
java.lang.ClassCastException: class java.time.LocalDate cannot be cast
to class java.lang.String (java.time.LocalDate and java.lang.String
are in module java.base of loader 'bootstrap')
at core.EditingCell.updateItem(main.groovy)
at javafx.scene.control.TableCell.updateItem(TableCell.java:665)
at javafx.scene.control.TableCell.indexChanged(TableCell.java:469)
at javafx.scene.control.IndexedCell.updateIndex(IndexedCell.java:120)
... фактически сообщение журнала, которое я поместил в начале core.EditingCell.updateItem()
(мой класс расширения TableCell
), НЕ печатается ... Также отмечу, что в файле main не указан номер строки. groovy в приведенном выше.