我正在编写一个包含2个不同BorderPanes,BorderPane A和BorderPane B的应用程序。 该应用程序有2个菜单项,这样,当点击它时,它显示BorderPane A或BorderPane B.
这是Application类,它具有我想要使用的阶段
public class SampleApp extends Application {
private Stage primaryStage;
public static void main(final String[] args) {
launch(args);
}
@Override
public void start(final Stage stage)
throws Exception {
final AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(SampleAppFactory.class);
final SpringFxmlLoader loader = new SpringFxmlLoader(context);
final Parent root = (Parent) loader.load("Main.fxml", Main.class);
final Scene scene = new Scene(root, 600, 480, Color.ALICEBLUE);
this.primaryStage = stage;
scene.getStylesheets().add("fxmlapp.css");
stage.setScene(scene);
stage.show();
}
}
Main.java类有两个BorderPanes,当选择menuItem时,我想在Application上显示borderpane。
有人知道如何通过此方法显示Borderpane(在舞台上设置场景)( showBorderPane )? 我想检索舞台并使用de borderpane设置场景:
public class Main extends BorderPane implements Initializable {
@FXML
private Verbinding verbindingContent; // BORDERPANE A
@FXML
private Beheer beheerContent;// BORDERPANE A
@FXML
private MenuBar menuContent;
@Override
public void initialize(final URL url, final ResourceBundle rb) {
System.out.println(url);
menuContent.setFocusTraversable(true);
}
@FXML
private void showBorderPane(final ActionEvent event) {
final MenuItem menuItem = (MenuItem) event.getSource();
}
@FXML
private void handleCloseAction(final ActionEvent event) {
System.exit(0);
}
}
我的Main.xml
<?xml version="1.0" encoding="UTF-8"?>
<?import java.lang.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.shape.*?>
<?import javafx.scene.effect.*?>
<?import nl.mamaloe.tab.view.Main?>
<BorderPane xmlns:fx="http://javafx.com/fxml" fx:controller="nl.mamaloe.tab.view.Main">
<fx:define>
<fx:include source="scene/Beheer.fxml" fx:id="beheerContent" />
<!-- fx:include source="Menu.fxml" fx:id="menuContent" / -->
</fx:define>
<top>
<MenuBar fx:id="menuContent" onMouseClicked="#handleKeyInput">
<menus>
<Menu text="Systeem">
<items>
<MenuItem text="Verbinding maken" onAction="#handleVerbindingAction"/>
<SeparatorMenuItem />
<MenuItem text="Afsluiten" onAction="#handleCloseAction"/>
</items>
</Menu>
<Menu text="TAB">
<items>
<MenuItem text="Script toevoegen" onAction="#handleAboutAction"/>
<SeparatorMenuItem />
<MenuItem text="Script draaien" />
</items>
</Menu>
<Menu text="About" onAction="#handleAboutAction">
<items>
<MenuItem text="Op basis van wizard" />
</items>
</Menu>
</menus>
</MenuBar>
</top>
<center> <Label text="Add New Dock of Home" />
</center>
我已经看到可以从应用程序的start方法执行此操作。 但我想在Main.java中实现它,因为结构和我主要使用FXML来声明GUI。
答案 0 :(得分:1)
当FXMLLoader加载“Main.fxml”文件时,会创建一个新的BorderPane(在Main.fxml中定义)。加载器还创建/初始化其控制器类,这是另一个具有自己实例的BorderPane派生类。所以有两种不同的BorderPanes实例。您的设计与一般方法略有不同,为了实现您的目标,我建议在FXML文件中添加一个容器,如下所示:
<center>
<StackPane fx:id="pane">
<children>
<Label text="Add New Dock of Home" />
</children>
</StackPane>
</center>
您可以使用所需的任何窗格/布局更改StackPane
。
接下来在控制器类中创建一个链接:
@FXML
private StackPane pane;
你应该删除“扩展BorderPane”,因为它已经没有意义了。最后,
@FXML
private void showBorderPane(final ActionEvent event) {
final MenuItem menuItem = (MenuItem) event.getSource();
pane.getChildren().clear(); // Clear old content.
switch (menuItem.getText()) {
case "Borderpane A":
pane.getChildren().add(borderPaneA);
break;
case "Borderpane B":
pane.getChildren().add(borderPaneB);
break;
default:
pane.getChildren().add(new Label("Add New Dock of Home"));
}
}