2014-03-19 51 views
0

我試圖實現一個應用程序,它有一個簡單的導航。一個主菜單,3個子菜單,每個子菜單又有3個子菜單。JavaFX,在同一個窗口中打開一個屏幕

我需要應用程序以Mainmenu作爲根屏幕在同一個窗口中遞歸地打開每個子菜單。我必須能夠通過每個子菜單上的「返回」按鈕返回到該菜單。

我爲每個(!)菜單和子菜單實現了一個Main類,一個Controller類和一個FXML文件。

E.g.我的主菜單

 package application; 

import org.apache.log4j.Logger; 
import javafx.application.Application; 
import javafx.fxml.FXMLLoader; 
import javafx.stage.Stage; 
import javafx.scene.Scene; 
import javafx.scene.layout.AnchorPane; 

public class Main extends Application { 

    // Initialize Logger 
    private static final Logger logger = Logger.getLogger(Main.class); 

    @Override 
    public void start(Stage primaryStage) 
    { 
     try 
     { 
      AnchorPane root = (AnchorPane)FXMLLoader.load(getClass().getResource("MainFrame.fxml")); 
      Scene scene = new Scene(root,1000,500); 

      primaryStage.setScene(scene); 
      primaryStage.show(); 
     } 
     catch(Exception e) 
     { 
      e.printStackTrace(); 
     } 
    } 

    public static void main(String[] args) 
    { 
     logger.info("Starting application."); 
     launch(args); 
    } 
} 

我MainController

package application; 

import org.apache.log4j.Logger; 


import javafx.application.Platform; 
import javafx.fxml.FXML; 
import javafx.fxml.FXMLLoader; 
import javafx.scene.Parent; 
import javafx.scene.Scene; 
import javafx.scene.control.Button; 
import javafx.scene.layout.AnchorPane; 
import javafx.scene.layout.BorderPane; 
import javafx.stage.Stage; 
import javafx.stage.StageStyle; 

public class MainFrameController 
{ 

    private static final Logger logger = Logger.getLogger(MainFrameController.class); 

    @FXML 
    private Button btn_random1; 
    @FXML 
    private Button btn_random2; 
    @FXML 
    private Button btn_random3; 
    @FXML 
    private Button btn_random4; 

    public void initialize() 
    { 
     //mainService = new MainService(); 
    } 

    @FXML 
    private void onRandomButton1() throws Exception 
    { 
     logger.info("onRandomButton1Clicked"); 

     Stage stage = new Stage(); 
     AnchorPane root; 
     root = (AnchorPane)FXMLLoader.load(getClass().getResource("RandomFXML1.fxml")); 
     Scene scene = new Scene(root,1000,500); 
     stage.setScene(scene); 
     stage.show(); 
    } 

    @FXML 
    private void onRandomButton2() 
    { 
     logger.info("onRandomButton1"); 
    } 

    @FXML 
    private void onRandomButton3() 
    { 
     logger.info("onRandomButton2"); 

    } 
    @FXML 
    private void onRandomButton4() 
    { 
     Platform.exit(); 
     logger.info("onRandomButton3"); 
    } 
} 

有沒有辦法簡單地改變我的代碼,因此它在同一個窗口打開呢?

我看了幾個解決這個問題的相對複雜的方法,我想堅持我的代碼,不要改變太多,否則我不得不重新開始。請注意,這只是許多Main/Controller/FXML組合中的一個,我有大約10個屏幕和「subscreens」,它們正在像這樣導航(由java打開一個新窗口)。

想法任何人?或者,也許是一個相對簡單的教程(我不需要改變我的整個代碼)?

謝謝!

回答

0

在根上有一個空的控制器(或者可能只有一個空的anchorpane)並讓它打開其他控制器並將其添加到當前窗格?

我目前有一個類似的設置,但有一個選項卡窗格:每個模塊都加載到一個單獨的選項卡。每個模塊本身都有一個fxml文件,一個控制器等。核心代碼爲每個模塊動態地創建新的選項卡等並加載它們。