【问题标题】:Text.setText() not updating text, throws NullPointerExceptionText.setText() 不更新文本,抛出 NullPointerException
【发布时间】:2016-06-29 12:09:21
【问题描述】:

Text.setText() 方法有点麻烦。它应该将String 名称设置为它的值。

FXML 代码有以下文字:

              <Text fx:id="airlineName" strokeType="OUTSIDE" strokeWidth="0.0" text="Airline Name Goes Here" GridPane.rowIndex="1">
                 <font>
                    <Font size="17.0" />
                 </font>
              </Text>

这是一段java代码:

 @FXML
 Text airlineName;

 private void loadNewWindow(String resource, Button button) throws IOException {
        Stage stage = (Stage) button.getScene().getWindow();
        Parent root = FXMLLoader.load(getClass().getResource(resource));
        Scene scene = new Scene(root);
        stage.setScene(scene);
        stage.show();
    }

 @FXML
 public void viewAirline() throws IOException {
        loadNewWindow("/main/resources/Airline Page.fxml", viewAirline);
        //some code here, involves Object selected
        String name = selected.name;
        airlineName.setText(name); //This is line 67
        airlineName.setFill(Color.RED);
        System.out.println(airlineName.getText());

    }

错误信息:

Caused by: java.lang.reflect.InvocationTargetException
    ...
javafx.fxml.FXMLLoader$MethodHandler.invoke(FXMLLoader.java:1771)
    ... 45 more
Caused by: java.lang.NullPointerException
at main.GUI.Controller.viewAirline(Controller.java:67)

viewAirline 方法不是在 java 中使用,而是在 FXML 中使用:

<Button fx:id="viewAirline" mnemonicParsing="false" onAction="#viewAirline" text="View Airline" GridPane.columnIndex="1" />

只要按下按钮(类似名称)viewAirline,它就会被激活。

此 FXML 代码是 viewAirline() 方法(“/main/resources/Airline Page.fxml”)中引用的不同 FXML 代码。 Text 元素在Airline Page.fxml 中被引用。所有 FXML 文件都使用相同的控制器。

【问题讨论】:

  • 这是因为airlineNameairlineText 不匹配吗?
  • 我的错误。没有不匹配,我这里写错了代码。在实际代码中是airlineName
  • 您确定您使用的是正确的控制器实例吗?顺便说一句:如果您使用 loadNewWindow 方法 static 会更好,因为与您的控制器实例没有真正的关系(除非 fxml 也使用包含类作为它的控制器类)。
  • 我支持@fabian:我想到 FXML 注入不在定义它的 FXML 文件中引用的控制器中。
  • @fabian:我不能让它成为静态的。来自FXMLLoader.load(getClass()...getClass() 不能从静态上下文中引用。

标签: java user-interface javafx fxml


【解决方案1】:

如果您在 fxml 文件中使用fx:controller 属性指定控制器类,则FXMLLoader 在加载期间会创建一个新的控制器实例。这导致airlineName 成为null,因为该字段被注入到控制器类的不同实例。要使用相同的控制器实例,您需要在加载 fxml 文件之前设置控制器,并从 fxml 文件中删除 fx:controller 属性:

FXMLLoader loader = new FXMLLoader(fxmlURL);
loader.setController(controllerInstance);
Parent root = loader.load();

但是我不建议对多个 fxml 使用相同的控制器。这会导致控制器的高耦合和更改,或者一个 fxml 文件可能会破坏其他 fxml 中的某些内容。尤其是initialize 方法需要考虑所有的 fxml。

您最好使用不同的控制器并让它们进行通信。您甚至可以针对接口进行编程以避免依赖具体的控制器类。

在使用getController()调用load()后,可以得到FXMLLoader创建的控制器实例(fx:controller属性存在):

FXMLLoader loader = new FXMLLoader(fxmlURL);
Parent root = loader.load();
ControllerClass controller = loader.getController();

【讨论】:

  • 对不起,我还是有点糊涂。我不确定要在代码中修改什么。
  • 假设你已经成功注入airlineName,并且保持loadNewWindow方法不是static,快速而肮脏的修复将使用@987654336方法中的第一个sn-p @ 和 fxmlURL = getClass().getResource(resource)(+ 从 /main/resources/Airline Page.fxml 中删除 fx:controller 属性)。
【解决方案2】:

它可能抛出空指针异常可能是因为您 selected.name 中的 name 属性为空,即它没有分配任何值。

【讨论】:

  • 我打印了selected.name,它不为空。如果我删除 setText 并改为使用 setFill,就会发生这种情况。
  • 仅将航空公司名称的文本定义放在课程开头!
  • 在课程的开头。我只提供了代码的相关部分。
【解决方案3】:

您没有实例化 airlineName 对象。试试下面的代码:

airlineName = new Text();
airlineName.setText(name);

【讨论】:

  • 这消除了异常,但是文本仍然没有更新,颜色也没有改变。
  • 该字段应该由FXMLLoader注入。分配字段值会将字段值更改为不属于场景图的Text 节点...
  • @fabian 但是它会抛出一个NullPointerException。但是,IDE 会看到 FXML 引用。可能是什么问题?
【解决方案4】:

也许它没有识别航空公司的文本标签,因为标签没有关闭 尝试关闭你的文本标签:

<Text fx:id="airlineName" strokeType="OUTSIDE" strokeWidth="0.0" text="Airline Name Goes Here" GridPane.rowIndex="1" />

 <Text fx:id="airlineName" strokeType="OUTSIDE" strokeWidth="0.0" text="Airline Name Goes Here" GridPane.rowIndex="1"></Text>

【讨论】:

  • 这会在加载过程中产生错误。此外,它只是 fxml 文件的一部分(也缺少导入、命名空间声明)。
  • 文本标签已关闭。我没有包括其余部分,但这里是:&lt;Text fx:id="airlineName" strokeType="OUTSIDE" strokeWidth="0.0" text="Airline Name Goes Here" GridPane.rowIndex="1"&gt; &lt;font&gt; &lt;Font size="17.0" /&gt; &lt;/font&gt; &lt;/Text&gt;
猜你喜欢
  • 1970-01-01
  • 2019-06-10
  • 1970-01-01
  • 2012-12-12
  • 2015-06-02
  • 1970-01-01
  • 2015-12-30
  • 1970-01-01
  • 2017-08-11
相关资源
最近更新 更多