Как использовать LocalDate в качестве столбца TreeTableView / TableView - PullRequest
0 голосов
/ 24 марта 2020

Впервые в 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 в приведенном выше.

...