2016-09-19 11 views
1

私はヘッダーとメニューを持つHomeScene.fxmlファイルを持つアプリを持っています。 HomeSceneにはdashboardPaneもあります。これは、メニューボタンを押した後に動的に変更する必要があります。ダッシュボードペインのコンテンツは別のfxmlファイルからロードする必要があります。たとえば、 'FinancesPane.fxml'または 'SettingsPane.fxml'とします。 HomeController中dashboardPaneの内容を置き換えるためにしようとJavaFX現在のシーンに新しいFXMLコンテンツを挿入する方法

イム:私FinancesPaneFactoryはこのようになります

@FXML 
public void handleFinancesButtonAction() { 
    FinancesPaneFactory paneFactory = new FinancesPaneFactory(); 
    dashBoardPane.getChildren().clear(); 
    dashBoardPane.getChildren().add(paneFactory.createPane()); 
} 

HomeScene:より明確にするために

public class FinancesPaneFactory extends PaneFactory { 

    private static final String PANE_TEMPLATE_PATH = "/sceneTemplates/FinancesPane.fxml"; 

    public FinancesPaneFactory() { 
     super(PANE_TEMPLATE_PATH); 
    } 

    @Override 
    protected Pane generatePane(FXMLLoader loader) { 
     try { 
      return (Pane) loader.load(); 
     } catch (IOException e) { 
      throw new FatBirdRuntimeException("Unable to load FinancesPane", e); 
     } 
    } 

} 

、これはHomeSceneがどのように見えるかです。 この空白はダッシュボードパネルで、左メニューボタンを押したときに別の内容に置き換えてください。

このコンテンツを動的に挿入するにはどうすればよいですか?

@FXML 
private ScrollPane dynamicNode; 

スクロールペインには良い選択です:

+1

dashBoardPaneはBorderPaneですか?はいの場合は、dashBoardPane.setCenter(pane)のようなメソッドを使用してください。 – BadVegan

+0

dashBoardPaneはAnchorPaneです。 –

答えて

1

はい、あなたは低いシーングラフを維持するために、これを行う必要があり、あなたがより良いパフォーマンスの恩恵を受ける、私は何をして、動的コンテナを作成することです。

これはMainControllerに置かれます。

私は他とは異なるメインコントローラ、メインコントローラは、あなたがそれを呼び出すものは何でもあなたのメインプログラムのクラスでは、実際に私は初期化だけであります。

private static MainViewController mainViewController; 

を...

private static BorderPane loadMainPane() throws IOException { 

     FXMLLoader loader = new FXMLLoader(); 
     loader.setController(mainViewController); 
     BorderPane mainPane = (BorderPane) loader.load(
       CsgoRr.class 
       .getResourceAsStream(Info.Resource.FXML_FILE_MAIN)); 
     mainPane.getStylesheets().add(CsgoRr.class.getResource("path...style.css").toString()); 

     return mainPane; 
    } 

私は静的なアクセサを作成することを忘れないでください、私は通常、この方法で作成されていない他のコントローラは、fxmlのfxmlコントローラを使用して、どのコントローラがfxmlであるべきかを指定します。だからあなたの意見は、そのあなたの変更ビュー

現在dynamicNodeで
@FXML 
private void setViewPreferences() { 
    setView(Info.Resource.FXML_FILE_PREFERENCES); 
} 

@FXML 
private void setViewProductPage() { 
    setView(Info.Resource.FXML_FILE_PRODUCT_PAGE); 
} 

は、その

正確に選択し、現在あるものを見るためにヘルパーですとあなたのメニューに接続されている、あなたのメインコントローラメソッドで作成変更する

ここで

private String currentlyInDynamicPane;//not important 

はsetviewコマンド

public void setView(String fxmlPath) { 
     dynamicNode.setContent(getView(fxmlPath)); 
      currentlyInDynamicPane = fxmlPath; 
    } 


    public Node getView(String fxmlPath) { 
     try { 
      return new FXMLLoader(getClass().getResource(fxmlPath)).load(); 
     } catch (IOException ex) { 
      ex.printStackTrace(); 
      return null; 
     } 
    } 

そうですFXMLファイルを交換する左メニューをクリックすると、最初に表示されるデフォルトのFXMLがあることを確認することができます。

これは私のやり方です。

あなたのダッシュボードをDynamicPaneと考えると、

関連する問題