2014-03-19 49 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文件,一个控制器等。核心代码为每个模块动态地创建新的选项卡等并加载它们。