Ответ 1
Используйте FXML в качестве компонентов, используя пользовательский класс java как fx: root и как fx: контроллер вашего файла FXML: http://docs.oracle.com/javafx/2/fxml_get_started/custom_control.htm
Для этого вам нужно вызвать конструктор вашего пользовательского класса java class FXMLLoader, который загрузит ваш FXML. Преимущество заключается в изменении способа загрузки компонентов 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);
}
}
И вы импортируете LoginBox и ProfilesBox в menu.fxml, который управляет глобальным расположением вашей страницы:
<?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 содержат только базовые компоненты.