在javaFX中切换场景

我在选择menuItem时尝试关闭当前场景并打开另一个场景时遇到问题。 我的主要阶段编码如下:

public void start(Stage primaryStage) throws Exception { primaryStage.setTitle("Shop Management"); Pane myPane = (Pane)FXMLLoader.load(getClass().getResource ("createProduct.fxml")); Scene myScene = new Scene(myPane); primaryStage.setScene(myScene); primaryStage.show(); } 

然后在createProduct.fxml中,当menuItem是onclick时,它将执行以下操作:

 public void gotoCreateCategory(ActionEvent event) throws IOException { Stage stage = new Stage(); stage.setTitle("Shop Management"); Pane myPane = null; myPane = FXMLLoader.load(getClass().getResource("createCategory.fxml")); Scene scene = new Scene(myPane); stage.setScene(scene); stage.show(); } 

它确实打开了createCategory.fxml。 但是,之前的createProduct.fxml面板不会关闭。 我知道有一些叫做stage.close()来做这件事,但是我不知道在哪里实现它,因为我没有从一开始就从主右边传递场景。 我想知道我应该怎么解决这个问题。

提前致谢。

您必须在start方法中进行一些更改,例如..

 public void start(Stage primaryStage) throws Exception { primaryStage.setTitle("Shop Management"); FXMLLoader myLoader = new FXMLLoader(getClass().getResource("createProduct.fxml")); Pane myPane = (Pane)myLoader.load(); CreateProductController controller = (CreateProductController) myLoader.getController(); controller.setPrevStage(primaryStage); Scene myScene = new Scene(myPane); primaryStage.setScene(myScene); primaryStage.show(); } 

你的CreateProductController.java将是,

 public class CreateProductController implements Initializable { Stage prevStage; public void setPrevStage(Stage stage){ this.prevStage = stage; } @Override public void initialize(URL location, ResourceBundle resources) { } public void gotoCreateCategory(ActionEvent event) throws IOException { Stage stage = new Stage(); stage.setTitle("Shop Management"); Pane myPane = null; myPane = FXMLLoader.load(getClass().getResource("createCategory.fxml")); Scene scene = new Scene(myPane); stage.setScene(scene); prevStage.close(); stage.show(); } } 

你有多种方法可以解决你的问题,我告诉你很少。 我从你的问题中理解的是,你想在顶部创建一个包含导航(菜单栏)的应用程序,通过使用它,用户可以切换到任何屏幕。

最简单的方法是使您的导航栏全局可用,方法是将其设置为静态或将其传递给屏幕,或者通过任何其他方法。 其次,制作一个屏幕(比如边框窗格)并在其上加载其他屏幕(其中心)。

您还可以在项目中使用弹簧集成,以便为您提供更好的控制器注入。 参见参考: http : //www.zenjava.com/2011/10/25/views-within-views-controllers-within-controllers/

您还可以创建自己的单屏控制器并使用它来管理其他屏幕。 请参阅参考: https : //blogs.oracle.com/acaicedo/entry/managing_multiple_screens_in_javafx1

但为此(上图),您必须更改或更新当前的体系结构。