JavaFX - 初始化Controller

时间:2016-05-13 04:24:40

标签: java javafx nullpointerexception scenebuilder jcomponent

主要课程:

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>

Controller:NavigationController

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都不会建立&#34;连接&#34;在fx:id(s)和我的控制器中的变量之间。

     

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

     

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

     

2。 )

     

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

     

例如:

     

Controller1&lt; - 与此链接,效果很好(在第二个初始化...) - &gt; FXML1.fxml

     

Controller1 - 尝试访问 - &gt;中的组件FXML2.fxml(悲惨地失败)

     

编辑:

     

通过&#34;尝试访问另一个fxml文件中的组件&#34;,我的意思是用鼠标点击或类似的东西 - &gt;并且肯定不是在初始化期间,因为一些fxml文件尚未加载。

我搜索了大量的答案,并在此上失去了几个小时。大多数情况下,通过纠正一些小的拼写错误,或者缺少@FXML标签或添加适当的Intializable接口实现等来解决smilar案例。

在我的情况下,我真的不明白。希望它只是一个拼写错误或一些小错误。

感谢您的回答

2 个答案:

答案 0 :(得分:1)

问题1:您是否直接在main_window.fxml中添加了FXML,或者您已将此FXML包含在main_window.fxml中?

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

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

答案 1 :(得分:0)

在fxml文件中尝试使用 fx:id = 代替 id = 。此解决方案对我有效。