3

2つの異なるBorderPanes、BorderPaneAとBorderPaneBを使用してアプリケーションを作成しています。アプリケーションには2つのメニュー項目があり、クリックするとBorderPaneAまたはBorderPaneBが表示されます。

これは、私が使用したいステージを持つ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クラスには2つのBorderPanesがあります。menuItemが選択されている場合、アプリケーションにborderpaneを表示します。

このメソッド( showBorderPane )からBorderpane(ステージにシーンを設定)を表示する方法を誰かが知っていますか?ステージを取得して、deborderpaneでシーンを設定したいと思います。

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を宣言しています。

4

1 に答える 1

1

「Main.fxml」ファイルがFXMLLoaderによってロードされると、新しいBorderPane(Main.fxmlで定義)が作成されます。ローダーは、独自のインスタンスを持つ別のBorderPane派生クラスであるコントローラークラスも作成/初期化します。したがって、BorderPanesには2つの異なるインスタンスがあります。ただし、設計は一般的なアプローチとは少し異なりますが、目標を達成するには、次のようにFXMLファイルの中央にコンテナーを追加することをお勧めします。

<center>
    <StackPane fx:id="pane">
        <children>
              <Label text="Add New Dock of Home" />
        </children>
    </StackPane>
</center>

StackPaneは、任意のペイン/レイアウトで変更できます。次に、コントローラークラスでリンクを作成します。

@FXML
private StackPane pane;

もう意味がないので、「extendsBorderPane」を削除する必要があります。ついに、

@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"));
    }
}
于 2012-05-25T15:52:45.860 に答える