Значение TreeItem равно нулю, выбрасывая исключение пустого указателя - PullRequest
0 голосов
/ 15 мая 2018

Я использую библиотеку JFoenix для создания своего пользовательского интерфейса.

У меня есть JFXTreeTableView, сопоставленный через FXML в моем классе контроллера:

@FXML private JFXTreeTableView<MyObject> table;

Данные, которые я использую для заполнения столбцов, хранятся в ObservableList, который не содержит нулевых данных, как показывает отладчик:

ObservableList<MyObject> list = FXCollections.observableArrayList(task.getValue());

После этого я создаю новый JFXTreeTableColumn:

JFXTreeTableColumn<MyObject, String> Column1 = new JFXTreeTableColumn<>("Column1");

Теперь исключение Null Pointer возникает, когда я пытаюсь setCellValueFactory() на столбце, например:

nameColumn.setCellValueFactory(param -> new SimpleStringProperty(param.getValue().getValue().getStringValue());

Отладчик показывает, что значение param TreeItem равно нулю. Но я не понимаю, почему это ноль. У меня почти такой же код в другом контроллере, который отлично работает.

Проверяемый пример:

FXML

<?xml version="1.0" encoding="UTF-8"?>

<?import com.jfoenix.controls.JFXButton?>
<?import com.jfoenix.controls.JFXSpinner?>
<?import com.jfoenix.controls.JFXTabPane?>
<?import com.jfoenix.controls.JFXTreeTableView?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.Tab?>
<?import javafx.scene.control.TreeTableView?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.StackPane?>

<StackPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity"
       prefHeight="768.0" prefWidth="1366.0"
       xmlns="http://javafx.com/javafx/8.0.141" xmlns:fx="http://javafx.com/fxml/1"
       fx:controller="sample.Controller">
<JFXTabPane>
    <Tab text="Home">
        <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="180.0" prefWidth="200.0">
            <JFXTreeTableView fx:id="table" layoutY="86.0" prefHeight="636.0" prefWidth="1366.0"
                              AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0"
                              AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="86.0">
                <columnResizePolicy>
                    <TreeTableView fx:constant="CONSTRAINED_RESIZE_POLICY"/>
                </columnResizePolicy>
            </JFXTreeTableView>
            <JFXButton layoutX="180.0" layoutY="29.0" onAction="#ExampleMethod" prefHeight="31.0"
                       prefWidth="83.0" text="Refresh"/>
        </AnchorPane>
    </Tab>
</JFXTabPane>
</StackPane>

Контроллер класса

public class Controller {

@FXML
private JFXTreeTableView<MyObject> table;

@FXML
public void ExampleMethod() {
    ObservableList<MyObject> list = FXCollections.observableArrayList();

    list.add(new MyObject("test_value"));

    JFXTreeTableColumn<MyObject, String> column = new JFXTreeTableColumn<>("Name");

    column.setCellValueFactory(param -> new SimpleStringProperty(param.getValue().getValue().getSomeValue()));

    final TreeItem<MyObject> root = new RecursiveTreeItem<>(list, RecursiveTreeObject::getChildren);

    table.getColumns().setAll(column);

    table.setRoot(root);
}
}

MyObject

package sample;

import com.jfoenix.controls.datamodels.treetable.RecursiveTreeObject;

public class MyObject extends RecursiveTreeObject<MyObject> {
private final String SomeValue;

public MyObject(String someValue) {
    SomeValue = someValue;
}

public String getSomeValue() {
    return SomeValue;
}

}

Ценю любую помощь,

Спасибо

...