Вы пытались использовать вместо этого StackPane?Просто настройте StackPane, содержащую ваши панели, и покажите / спрячьте или перенесите в нужную панель.Нет необходимости перезагружать один и тот же FXML несколько раз.
Дополнительное преимущество: состояние основного окна не теряется после перехода на страницу объекта и обратно.
Вот пример того, какиспользовать StackPane для переключения компонентов пользовательского интерфейса, используя несколько FXML и включает.
top.fxml
- определение области стека и включая фактические представления:
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.layout.StackPane?>
<StackPane xmlns:fx="http://javafx.com/fxml" fx:controller="de.reinhardt.playground.javafx.TopController">
<fx:include fx:id="main" source="main.fxml"/>
<fx:include fx:id="object" source="object.fxml" />
</StackPane>
TopController.java
- реализация для переключения междупредставления, используя импортированные контроллеры
public class TopController implements Initializable {
@FXML
private MainController mainController;
@FXML
private ObjectController objectController;
@Override
public void initialize(URL location, ResourceBundle resources) {
mainController.setTopController(this);
objectController.setTopController(this);
showMainPage();
}
public void showMainPage() {
objectController.hidePage();
mainController.showPage();
}
public void showObjectPage() {
mainController.hidePage();
objectController.showPage();
}
}
main.fxml
- реализация основного вида, включая кнопку для перехода к виду объекта
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.layout.VBox?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<VBox xmlns:fx="http://javafx.com/fxml" fx:id="mainPage" fx:controller="de.reinhardt.playground.javafx.MainController">
<Label>Your Main Components go here.</Label>
<Button onAction="#toObjectPage">To Object Page</Button>
</VBox>
MainController
- контроллер дляосновной вид
public class MainController {
private TopController topController;
@FXML
private Node mainPage;
public void showPage() {
mainPage.setVisible(true);
mainPage.toFront();
}
public void hidePage() {
mainPage.setVisible(false);
}
public void setTopController(TopController topController) {
this.topController = topController;
}
@FXML
public void toObjectPage() {
topController.showObjectPage();
}
}
object.fxml
, определяющий вид объекта и соответствующий ObjectController
, опущен.Они похожи на main.fxml
и MainController
.Разница лишь в том, что кнопка ведет обратно к основному виду.