シーンの変化部分は簡単です。メインシーンでは、異なるビューを動的にロードするコンテナを配置します。以下は、一般的な「静的」メニューの説明の例です:
これは基本的なビューです。 mainView
では、さまざまなビューが読み込まれ(デフォルトはview_a.fxml)、表示>ビューの表示Xメニューから変更されます。私が個人に割り当てたID MenuItem
は、ロードするFXML
ファイルの名前です。
<BorderPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8.0.141" xmlns:fx="http://javafx.com/fxml/1" fx:controller="sample.Controller">
<top>
<MenuBar BorderPane.alignment="CENTER">
<menus>
<Menu mnemonicParsing="false" text="File">
<items>
<MenuItem mnemonicParsing="false" text="Close" />
</items>
</Menu>
<Menu mnemonicParsing="false" text="View">
<items>
<MenuItem fx:id="view_a" mnemonicParsing="false" text="Show View A" onAction="#handleChangeView"/>
<MenuItem fx:id="view_b" mnemonicParsing="false" text="Show View B" onAction="#handleChangeView"/>
</items>
</Menu>
</menus>
</MenuBar>
</top>
<center>
<BorderPane fx:id="mainView">
<center>
<fx:include source="view_a.fxml"/>
</center>
</BorderPane>
</center>
</BorderPane>
これはビュー(view_a.fxml)の1つです。もう一つは同じなので、私はそれを示しません。これらのビューでは、コントローラを後でメインフレームで使用するため、コントローラを指定しないと面白いです(これは小さなものには適していますが、大きなプロジェクトでは異なるコントローラを使用するのがうれしい)。
<AnchorPane xmlns="http://javafx.com/javafx" xmlns:fx="http://javafx.com/fxml">
<children>
<Label text="View A"/>
</children>
</AnchorPane>
コントローラ自体は特別なものではありません。それはちょうど、選択されたオプションのIDへの1つ「.fxml」を追加した名前を持つFXML
ファイルをロードし、mainView
センター
public class Controller {
@FXML
private BorderPane mainView;
@FXML
private void handleChangeView(ActionEvent event) {
try {
String menuItemID = ((MenuItem) event.getSource()).getId();
FXMLLoader loader = new FXMLLoader(getClass().getResource(menuItemID + ".fxml"));
loader.setController(this);
mainView.setCenter(loader.load());
}
catch (IOException e) {
e.printStackTrace();
}
}
}
[ 'BorderPane'](HTTPSでそれを置く:// docs.oracle.com/javase/8/javafx/api/javafx/scene/layout/BorderPane.html)は、この状況で役立ちます。 – Sedrick
@SedrickJeffersonしかし、私は手動でBorderPaneの子を削除して追加する必要はありませんか?私はSceneBuilderで生成されたFXMLファイルを添付するために、.setRoot()のようなメソッドを呼び出すことができる "SubScene"を探しています。 –
@ M.Benamar: 'SubScene.setRoot'または' BorderPane.setCenter'は複雑さに関してはあまり違いがありません。 – fabian