2017-11-23 9 views
2

私はJavaFXの初心者ですが、この問題に関するチュートリアル/答えは見つかりませんでした。JavaFX/SceneBuilder - シーンの部分のみを変更する

基本的に私のやりたいことは、自分のシーンの一部だけを変更することです。私は上部に静的メニューバーを保持し、どのメニューボタンがクリックされているかに応じて下部を変更するだけです。つまり、すべての「ページ」に対して異なるFXMLファイルとコントローラクラスが必要です。

利用可能なJavaFXの機能を見ると、私はSubSceneがその仕事をすると思っていました。しかし、さらなる調査の後、SubScenesは3Dのもののために作られているようですね?だから私は本当に何をすべきかわからない。

ご協力いただければ幸いです!

+1

[ 'BorderPane'](HTTPSでそれを置く:// docs.oracle.com/javase/8/javafx/api/javafx/scene/layout/BorderPane.html)は、この状況で役立ちます。 – Sedrick

+0

@SedrickJeffersonしかし、私は手動でBorderPaneの子を削除して追加する必要はありませんか?私はSceneBuilderで生成されたFXMLファイルを添付するために、.setRoot()のようなメソッドを呼び出すことができる "SubScene"を探しています。 –

+0

@ M.Benamar: 'SubScene.setRoot'または' BorderPane.setCenter'は複雑さに関してはあまり違いがありません。 – fabian

答えて

1

シーンの変化部分は簡単です。メインシーンでは、異なるビューを動的にロードするコンテナを配置します。以下は、一般的な「静的」メニューの説明の例です:

これは基本的なビューです。 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(); 
     } 
    } 
} 
関連する問題