2017-04-02 14 views
0

パズルブロックが5×5の矩形のグリッド内に構築されているアプリケーションを作成しています。私は離れてFXを宣言から移動しました:コントローラー.fxmlファイルにし、代わりに、メインでこれをやった:コントローラを手動で追加しているときにFXMLオブジェクトのnullPointerExceptionが発生する

@Override 
    public void start(Stage primaryStage) throws Exception { 
     FXMLLoader baseViewLoader = new FXMLLoader(getClass().getResource("Views/BaseView.fxml")); 
     baseViewLoader.setLocation(getClass().getResource("Views/BaseView.fxml")); 
     baseViewLoader.setController(new DockViewController()); 
     Parent root = baseViewLoader.load(); 

     FXMLLoader dockLoader = new FXMLLoader(getClass().getResource("Views/DockView.fxml")); 
     dockLoader.setLocation(getClass().getResource("Views/DockView.fxml")); 
     dockLoader.setController(new DockViewController()); 
     Parent dockView = dockLoader.load(); 

     primaryStage.setResizable(false); 
     primaryStage.sizeToScene(); 

     primaryStage.setTitle("Tiles 2059275"); 

     Scene gameScene = new Scene(root); 

     primaryStage.setScene(gameScene); 

     primaryStage.show(); 

     new GameController(); 
    } 

今ではコントローラーを持つ経由して行われていた以前際に.fxmlファイルを経由して、コードのこの部分を宣言しました私DockViewControllerの初期化が正常に動作します:dockStackPaneがヌルであるため、

@FXML 
    StackPane dockStackPane; 

    @Override 
    public void initialize(URL location, ResourceBundle resources) { 
     for (int i = 0; i < 5; i++) { 
      for (int j = 0; j < 5; j++) { 
       tile1 = createSquare(Color.GREY); 
       tile2 = createSquare(Color.GREY); 
       tile3 = createSquare(Color.GREY); 

       tile1.setTranslateX(32 * (i) - 176); 
       tile1.setTranslateY(32 * (j) - 48); 

       tile2.setTranslateX(32 * (i) - 16); 
       tile2.setTranslateY(32 * (j) - 48); 

       tile3.setTranslateX(32 * (i) + 144); 
       tile3.setTranslateY(32 * (j) - 48); 

       dockStackPane.getChildren().add(tile1); 
       dockStackPane.getChildren().add(tile2); 
       dockStackPane.getChildren().add(tile3); 

       puzzleBlock1.add(tile1); 
       puzzleBlock2.add(tile2); 
       puzzleBlock3.add(tile3); 
      } 
     } 
     System.out.println("Ini test"); 
    } 

エラーがdockStackPane.getChildren().add(tile1);で起こります。私がMainでコントローラを手動で追加して削除し、FXMLファイルにfx:controllerを付けたコントローラを追加すると、正常に動作します。しかし、私は私のコントローラへの参照を持っていません。

DockView.fxml

<?xml version="1.0" encoding="UTF-8"?> 

<?import javafx.scene.layout.Pane?> 
<?import javafx.scene.layout.StackPane?> 

<Pane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="128.0" prefWidth="384.0" xmlns="http://javafx.com/javafx/8.0.111" xmlns:fx="http://javafx.com/fxml/1"> 
    <children> 
     <StackPane fx:id="dockStackPane" prefHeight="128.0" prefWidth="384.0" /> 
    </children> 
</Pane> 

そしてDockViewがBaseViewに含まれている、私は解決策を、それをうまくすることができた私の質問へのコメントに

+0

@Fabian '' '@FXML StackPane dockStackPane;' ' 'これを使用しようとするとヌルを返します。コントローラを手動で割り当てました。代わりに、コントローラをfx:controller経由でビューに追加すると動作します。しかし、私は私のDockViewControllerへの参照を持っていません –

+0

なぜ両方のコントローラに同じコントローラクラスを使用していますか?両方のFXMLファイルに 'dockStackPane'がありますか? 'baseViewLoader.load()'または 'dockLoader.load()'の間に例外が発生していますか? –

+0

@James_D dockLoader.load()の実行中に初期化しようとしているためです。もう一度、私がfx:controllerをDockView.fxmlのDockViewControllerにペイン要素にセットしたとき、このコードは正しく動作していました。 –

答えて

0

おかげでFXを追加することです:IDに私BaseView.fxmlに含める:

<fx:include fx:id="includedDockView" source="DockView.fxml" /> 

含ま要素はその後、FXを持っていることを確認します:ように設定コントローラ:

あなたが行うことができますBaseViewControllerで7​​
<Pane fx:id="dockPane" fx:controller="tiles.Controllers.DockViewController" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="128.0" prefWidth="384.0" xmlns="http://javafx.com/javafx/8.0.111" xmlns:fx="http://javafx.com/fxml/1"> 

その後:

@FXML 
    private DockViewController includedDockViewController; 

    public DockViewController getDockViewController() { 
     return includedDockViewController; 
    } 

メインに次のようなBaseViewを渡すことができます。

public void start(Stage primaryStage) throws Exception { 
    FXMLLoader baseViewLoader = new FXMLLoader(getClass().getResource("Views/BaseView.fxml")); 
    baseViewLoader.setLocation(getClass().getResource("Views/BaseView.fxml")); 
    baseViewLoader.setController(new BaseViewController()); 
    Parent root = baseViewLoader.load(); 

    primaryStage.setResizable(false); 
    primaryStage.sizeToScene(); 

    primaryStage.setTitle("Tiles 2059275"); 

    Scene gameScene = new Scene(root); 

    primaryStage.setScene(gameScene); 

    primaryStage.show(); 

    new GameController(baseViewLoader); 
} 
+0

そのコードの最後の行は何もしません。これ以外は正しいアプローチのようです。 –

関連する問題