【问题标题】:JavaFX getting the primaryStage (Main Menu) of my AppJavaFX 获取我的应用程序的primaryStage(主菜单)
【发布时间】:2014-05-31 20:49:30
【问题描述】:

我正在尝试使用 JavaFX 和 SceneBuilder 实现一个应用程序。

我用不同的按钮制作了一个主菜单,每个按钮都指向不同的页面。

例如,当我单击第一个按钮时,我希望切换到一个新面板,然后,如果我想返回上一个面板,我只需单击“返回”按钮我得到的第二个面板。

第一步,当我点击按钮时有一个新页面,没关系。现在问题在于实现“返回”按钮。我想点击它,并拥有上一个面板,但我没有找到解决方案。

代码如下:

我的应用程序的启动方法(OrderCheck.java)

@Override
public void start(Stage primaryStage) throws Exception {

    this.primaryStage = primaryStage;
    FXMLLoader myLoader = new FXMLLoader(getClass().getResource("OrderCheck.fxml"));
    Pane myPane = (Pane)myLoader.load();
    primaryStage.setTitle("Main Menu");
    OrderCheckController controller = (OrderCheckController) myLoader.getController();
    controller.setPrevStage(primaryStage);
    Scene myScene = new Scene(myPane);        
    primaryStage.setScene(myScene);
    primaryStage.show();
}

主面板上1个按钮的onAction示例:(OrderCheckController.java):

public void personalButtonAction(ActionEvent event) throws IOException {
   Stage stage = new Stage();
   stage.setTitle("Personal Menu");
   AnchorPane myPane = null;
   myPane = FXMLLoader.load(getClass().getResource("Personal.fxml"));
   Scene scene = new Scene(myPane);
   stage.setScene(scene);

   prevStage.close();

   stage.show();
}

单击新视图中的后退按钮的示例 (PersonalController.java):

public void backButtonAction(ActionEvent event) throws IOException {
    Stage stageTheLabelBelongs = (Stage) backButton.getScene().getWindow();
    setPrevStage(stageTheLabelBelongs);
    prevStage.close();
    stageTheLabelBelongs.show();
 }

方法 setPrevStage(Stage stage) 在两个控制器(OrderCheckController 和 PersonalController)中都实现了

public void setPrevStage(Stage stage){
     this.prevStage = stage;
}

所以现在当我点击新页面上的“返回”按钮时,窗口将快速关闭并再次打开,因为什么都没发生。

【问题讨论】:

  • Juggling Stages 对于您正在尝试做的事情似乎是一种严厉的方法。您是否有理由要使用多个Stages 而不是管理NodesPanesParents 等的List<>
  • 您看过 Oracles FX Demo and Samples 中的登录演示吗? Main 类展示了如何用不同的阶段/FXML 替换场景内容

标签: java javafx javafx-2 fxml scenebuilder


【解决方案1】:

试试这样。我在我的应用中以这种方式指代初级阶段。

public class JavaFXApplication extends Application {

public static Stage primaryStage;

@Override
public void start(Stage stage) {

    stage.setTitle("Hello World!");
    stage.setScene(scene);
    stage.show();

    primaryStage = stage;
}

public static void main(String[] args) {
    launch(args);
}
}

您可以从其他控制器使用JavaFXApplication.primaryStage 访问它

【讨论】:

    【解决方案2】:

    如果您有像用户 Sudip Saha 这样的主类,那么只需在您使用后退按钮的控制器中创建方法 goBack()。

    goBack() 方法:

    public void goBack() {
        BorderPane mainScreen;
        try {
            mainScreen = (BorderPane) FXMLLoader.load(JavaFXApplication.class .getResource("../javafx/main.fxml"));
            JavaFXApplication.setCenterPane(mainScreen); 
        } catch (IOException e) {
            e.printStackTrace();
        } 
    }
    

    之后只需在 Scene Builder 的“返回”按钮中调用 goBack() 方法

    【讨论】:

      猜你喜欢
      • 2016-05-22
      • 1970-01-01
      • 2013-03-26
      • 1970-01-01
      • 1970-01-01
      • 2020-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多