【问题标题】:JavaFX - Components are null when initializing ControllerJavaFX - 初始化控制器时组件为空
【发布时间】:2016-05-13 04:24:40
【问题描述】:

主类:

Parent root = FXMLLoader.load(getClass().getResource("../layouts/main_window.fxml"));
primaryStage.setTitle("IMGManager");
primaryStage.setScene(new Scene(root));
primaryStage.show();

FXML:

<VBox id="navigation" stylesheets="@../../css/center_panels.css" 
      xmlns="http://javafx.com/javafx/8" 
      xmlns:fx="http://javafx.com/fxml/1" 
      fx:controller="controllers.NavigationController">

  <!-- ... -->

  <!-- List -->
  <AnchorPane prefHeight="1500.0" prefWidth="492.0">
      <children>
          <ListView id="directories-list" 
                    fx:id="navigationList" 
                    prefHeight="500.0" ... />
      </children>
  </AnchorPane>

</VBox>

控制器:导航控制器

public class NavigationController implements Initializable {

    @FXML private ListView<String> navigationList;

    // ...

    @Override
    public void initialize(URL location, ResourceBundle resources) {

        // Get Home Directory
        FileSystemView fsw = ...

        // Updates the information displayed in the Navigation panel.
        if (navigationList != null)
        {
            updateNavigationDisplay();
        }
    }

    // ...
}

你好,我遇到的问题是:

1. )

每当我尝试链接 JavaFX 组件和 Controller 变量时,Scene Builder 和 Intellij 都不会在 fx:id(s) 和我的 Controller 中的变量之间建立“连接”。

我总是在我的控制器初始化中得到 nullPointerError,但我发现了一个(麻烦的)解决方法:if (navigationList != null)

我注意到我的初始化方法触发了两次。一次使用空组件,第二次(魔术)检测组件。因此,通过添加if (navigationList != null),我在第一次初始化时不会出现任何错误,而在第二次初始化时我会做一些很酷的事情。

2。 )

我无法访问位于另一个 FXML 文件中的组件,然后是与控制器链接的那个:nullPointer。

例如:

Controller1 FXML1.fxml

Controller1 -- 试图访问 --> FXML2.fxml 中的组件(失败得很惨)

编辑:

通过“尝试访问另一个 fxml 文件中的组件”,我的意思是通过鼠标单击或类似的方式 -> 当然不是在初始化期间,因为某些 fxml 文件尚未加载。

我搜索了很多答案并为此浪费了几个小时。大多数时候,通过纠正一些小的拼写错误、缺少@FXML 标签或添加 Intializable 接口的正确实现等来解决类似的情况。

就我而言,我真的不明白。希望这只是拼写错误或一些小错误。

感谢您的回答

【问题讨论】:

    标签: java javafx nullpointerexception scenebuilder jcomponent


    【解决方案1】:

    问题 1:您是直接在 main_window.fxml 中添加了给定的 FXML,还是在 main_window.fxml 中包含了这个 FXML?

    问题 2:要通过您的第一个 fxml 控制器访问位于另一个 fxml 中的组件,请参阅此链接: https://www.youtube.com/watch?v=NgubWgheboI

    我也遇到了同样的问题。:)

    【讨论】:

    • 问题 1: 确实包含给定的 FXML。 问题 2: 我看了几次视频,我的代码不同的是:a.) 我实现了 Initializable 接口(所以我猜是用于初始化控制器的视频是另一种选择)。 b.) 它说包含文件将 it's fx:id 设置为其对应的 fxml 文件名很重要。我不明白为什么,但我在我的 fxml 文件中更新了它,但什么也没发生。
    • 好的,我想我明白了。要在 FXML 文件之间进行通信,您需要一个可以通过包含 fx:id 访问两个(或多个)FXML 文件的控制器。因此,在设计应用程序时,我必须将需要在它们之间进行通信的 FXML 文件分组在同一个控制器下(访问其控制器的控制器...exemple)。那正确吗?我目前正在重组我的应用程序以进行尝试,不会太久。同时,您对我的问题 1 有什么想说的(还没有找到解决方案)
    【解决方案2】:

    尝试在 fxml 文件中使用 fx:id= 而不是 id=。这个解决方案对我有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-15
      • 1970-01-01
      • 2013-01-31
      • 2020-09-05
      • 1970-01-01
      • 2016-04-19
      相关资源
      最近更新 更多