【问题标题】:TreeItem value is null, throwing Null Pointer ExceptionTreeItem 值为空,抛出空指针异常
【发布时间】:2018-05-15 14:19:45
【问题描述】:

我正在使用 JFoenix 库来构建我的 UI。

我的控制器类中有一个通过 FXML 映射的 JFXTreeTableView

@FXML private JFXTreeTableView<MyObject> table;

我用来填充列的数据存储在ObservableList 中,其中不包含调试器显示的任何空数据:

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

之后我创建了一个新的JFXTreeTableColumn

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

现在当我尝试在列上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);
}
}

我的对象

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;
}

}

感谢任何帮助,

谢谢

【问题讨论】:

  • 你能加一个minimal, complete, and verifiable, example吗?我知道在某些版本的 JavaFX 中,ChoiceBox 在第一次选择时会返回 null 值。我不知道JFXTreeTableView 是否会受到同样的影响。
  • @M.leRutte 我添加了一个可验证的示例
  • 在设置表根后调用setShowRoot(false),很可能会解决您的问题
  • 请使用java命名约定

标签: java javafx jfoenix


【解决方案1】:

我也遇到了这个错误,并通过声明我的变量解决了这个问题。 在你的情况下,

private JFXTreeTableView<MyObject> table;

private JFXTreeTableView<MyObject> table = new JFXTreeTableView<>();

【讨论】:

  • 此处不适用:OP 似乎想通过 fxml 注入表 - 在这种情况下,您不得手动实例化该字段
猜你喜欢
  • 1970-01-01
  • 2013-04-09
  • 2020-11-22
  • 2020-08-10
  • 2013-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多