在给出fx:id之后,我在控制器中得到一个nullpointer,但错误仍然存​​在

时间:2017-08-10 18:53:40

标签: java javafx javafx-2 javafx-8

我有一个fxml表示,其中我将我的fx:id定义为ContentPane

<center>
            <Pane fx:id="ContentPane" prefHeight="200.0" prefWidth="200.0" BorderPane.alignment="CENTER" />
         </center>

在主应用程序中,我有

    public class Home_pageController extends Application {

    @FXML
    private Pane ContentPane;

    /**
     * Initializes the controller class.
     */
    /**
     * Initializes the controller class.
     */
    @Override
    public void start(Stage stage) throws Exception {
      Parent root = FXMLLoader.load(getClass().getResource("home_page.fxml"));           
        Scene scene = new Scene(root);
        stage.setTitle("Some scene");    
        stage.setScene(scene);         
        stage.show();
        MyGrid();
    }
    public static void main(String[] args) {
        launch(args);
    }
    public void MyGrid() throws IOException {        
        GridPane root = new GridPane();
        Label test = new Label("Test");
        root.add(test,0,0);
        ContentPane.getChildren().clear();
        ContentPane.getChildren().add(root);        
    }
   }

我收到以下错误

 java.lang.NullPointerException
    at controllers.Home_pageController.MyGrid(Home_pageController.java:70)
    at controllers.Home_pageController.start(Home_pageController.java:62)
    at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$162(LauncherImpl.java:863)
    at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$175(PlatformImpl.java:326)
    at com.sun.javafx.application.PlatformImpl.lambda$null$173(PlatformImpl.java:295)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.sun.javafx.application.PlatformImpl.lambda$runLater$174(PlatformImpl.java:294)
    at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
    at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
    at com.sun.glass.ui.win.WinApplication.lambda$null$148(WinApplication.java:191)
    at java.lang.Thread.run(Thread.java:745)

1 个答案:

答案 0 :(得分:2)

如果在fxml中指定了fx:controller属性,FXMLLoader使用指定为属性值的类的构造函数来构造 新实例 控制器。

控制器的现有实例不会自动重复使用。

这就是为什么启动的应用程序实例的ContentPane字段永远不会被修改并保持null