JavaFX TreeTableView установить пользовательский узел в ячейке строки - PullRequest
0 голосов
/ 05 июля 2018

Я хочу создать древовидную таблицу, которая может показывать для каждого элемента дерева поддерево со строкой, содержащей пользовательские узлы (в данном случае кнопка).

В конце я хочу, чтобы это выглядело так.

Чтобы достичь этого, мне, вероятно, нужна фабрика пользовательских строк.

//set custom row factory
    treeTableView.setRowFactory(new Callback<TreeTableView<Struct>, TreeTableRow<Struct>>() {
        @Override
        public TreeTableRow<Struct> call(TreeTableView<Struct> param) {
            return new TreeTableRow<Struct>(){
                @Override
                protected void updateItem(Struct item, boolean empty) {
                    super.updateItem(item, empty);
                    //check if row has values
                    if (!empty) {
                        //override the row cell graphics if boolean is set
                        if (item.isCustomRow()) {
                            setGraphic(new StackPane(new Button("Button")));
                        }
                    } else {
                        setGraphic(null);
                    }
                }
            };
        }
    });

Моя идея состояла в том, чтобы переопределить метод updateItem () и использовать метод setGraphic () для отображения кнопки. Чтобы указать, показывает ли элемент дерева мой собственный графический узел или значение по умолчанию, я добавил логическое значение в свой класс структуры таблицы (Struct).

//Struct contains treetable data
class Struct {

...
//the boolean defines if the row graphics should be overridden
Boolean customRow;
...

public Boolean isCustomRow() {
    return customRow;
}}

Результат, который я получил, вы можете увидеть здесь . Я похож на пустые ячейки столбца внутри строки, блокирующие мой собственный узел.

Я подозреваю, что мне также нужен собственный TreeTableRowSkin, но я не нашел примеров, как это реализовать. Есть ли кто-нибудь, кто может помочь мне решить эту проблему?

Полный пример кода можно найти здесь .

...