カスタム Java クラスを FXML ファイルの fx:root および fx:controller として使用することにより、FXML をコンポーネントとして使用します: http://docs.oracle.com/javafx/2/fxml_get_started/custom_control.htm
そのためには、FXML をロードするカスタム Java クラス FXMLLoader のコンストラクターを呼び出す必要があります。利点は、FXML がコンポーネントをロードする方法を変更できることです。
ネストされたコントローラーを使用して FXMLLoader を介してコンポーネントをインスタンス化する従来の方法は、まず FXML を使用し、次に各パーツのコントローラーを使用することです。
この手法では、最初にコントローラー、次に各コンポーネントの FXML です。また、FXML を FXML に直接ロードするのではなく、カスタム Java クラスを FXML にインポートします。
これはより優れた抽象化 (コンポーネントを FXML にインポートするときにコンポーネントがどのように実装されているかを知る必要はありません) であり、FXML をサポートするカスタム ウィジェットを実装するのと同じようにコードを再利用するのに役立ちます。コンポーネントを再利用可能にするには、実装が他の部分と密結合していないことを確認するか、IOC を使用してそうします (たとえば、Spring と JavaFX の統合)。このようにして、アプリケーションの任意の部分 (DateInput ウィジェットと同様) にコンポーネントを心配することなくインポートでき、コードを複製する必要がなくなります。
あなたの場合、次のようになります。
public class MenuBox extends VBox {
@FXML
private LoginBox loginBox;
@FXML
private ProfilesBox profilesBox;
public MenuBox() {
FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("menu.fxml"));
fxmlLoader.setRoot(this);
fxmlLoader.setController(this);
try {
fxmlLoader.load();
} catch (IOException exception) {
throw new RuntimeException(exception);
}
}
public class LoginBox extends VBox {
public LoginBox() {
FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("login.fxml"));
fxmlLoader.setRoot(this);
fxmlLoader.setController(this);
try {
fxmlLoader.load();
} catch (IOException exception) {
throw new RuntimeException(exception);
}
}
public class ProfilesBox extends VBox {
public ProfilesBox() {
FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("profiles.fxml"));
fxmlLoader.setRoot(this);
fxmlLoader.setController(this);
try {
fxmlLoader.load();
} catch (IOException exception) {
throw new RuntimeException(exception);
}
}
そして、ページのグローバル レイアウトを管理する menu.fxml に LoginBox と ProfilesBox をインポートします。
<?import com.foo.bar.LoginBox ?>
<?import com.foo.bar.ProfilesBox ?>
<fx:root type="javafx.scene.layout.VBox"
xmlns:fx="http://javafx.com/fxml">
<!-- Stuff here to declare the menu bar-->
<HBox>
<ProfilesBox fx:id="profilesBox"/>
<LoginBox fx:id="loginBox"/>
</HBox>
</fx:root>
login.fxml と profiles.fxml には、基本的なコンポーネントのみが含まれています。