2016-05-19 6 views
0

JavaFXML documentationが不足している限り、fx:includeは、FXMLを個々のファイルに分割して別のファイルに含める方法です'コンテンツはコピーペーストされました。つまり、Cインクルードコンパイラ指令を使用するのと同じです。JavaFX fx:親コントローラのシーン可視性を含む

しかし、含まれているFXMLドキュメント内のノードが親のコントローラに見えないため、そうではないようです。次のことを考えてみましょう:

<?import javafx.scene.layout.GridPane?> 
<?import javafx.scene.control.*?> 

<GridPane xmlns:fx="http://javafx.com/fxml" fx:controller="Sample.controller"> 
    <ToolBar xmlns:fx="http://javafx.com/fxml" fx:id="aToolbar"> 
     <Button fx:id="aButton" text="Press me Baby!"/> 
    </ToolBar> 
</GridPane> 

期待通りに動作しますが、次のコードは...

<?import javafx.scene.layout.GridPane?> 
<GridPane xmlns:fx="http://javafx.com/fxml" fx:controller="Sample.controller"> 
    <fx:include source="children.fxml"/> 
</GridPane> 

children.fxmlは、(上記のように)次のものが含まれていない場合は:

<?import javafx.scene.control.*?> 
<ToolBar xmlns:fx="http://javafx.com/fxml" fx:id="aToolbar"> 
    <Button fx:id="aButton" text="Press me Baby!"/> 
</ToolBar> 

children.fxml内のノードは、親コントローラには表示されません。 children.fxml内のノードはシーングラフの一部になり、ルートにはコントローラがあります。 結果(aButtonにイベントハンドラをアタッチする場合)は、NullPointerExceptionです。

そう... FXMLファイルを実行してくださいFXを使用して含まれます。includeが自分のコントローラを必要とし、そうであれば、なぜですか?複数のコントローラ間の通信を必要とせずに、シーングラフの大部分を分離することは素晴らしい機能です。

答えて

1

はい、含まれているFXMLファイルは別々のFXMLファイルなので、独自のコントローラクラスを持つ必要があります。これにより、含まれる部分が再利用可能になり、含まれるFXMLファイルのコントローラへの参照がなくなり、含まれる可能性のあるFXMLファイルを変更することができます。言い換えれば、付属のFXMLコントローラのペアは完全にカプセル化されています。

この場合のコントローラ間のドキュメントexplicitly shows how to communicate

関連する問題