如何使用后退按钮和不同的控制器返回上一页? JAVAFX,JAVA

时间:2017-01-17 07:59:18

标签: java javafx fxml scenebuilder

我对JAVAFX很新,所以请耐心等待。任何帮助是极大的赞赏。首先,我有一个加载addItems.fxml和addItemsController的主应用程序。

public class UncookedApp extends Application {

private Stage stage;
@Override
public void start(Stage primaryStage) {
    stage = primaryStage;

    try {
        FXMLLoader loader=new FXMLLoader();
        loader.setLocation(getClass().getResource("/uncooked/view/addItems.fxml"));
        AnchorPane root=loader.load();
        addItemsController itemsCtrl=loader.getController();
        itemsCtrl.setMainApp(this);
        Scene scene=new Scene(root,1024,768);
        primaryStage.setScene(scene);
        primaryStage.show();
    } catch(Exception e){
        e.printStackTrace();
    }
}

public Stage getStage() {
    return stage;
}

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

这是addItemsController的一部分:

private UncookedApp mainApp;

public UncookedApp getMainApp() {
    return mainApp;
}
public void setMainApp(UncookedApp mainApp) {
    this.mainApp = mainApp;
}
public void toMeat(ActionEvent event) {
    Stage stage1=mainApp.getStage();
    try {
        FXMLLoader loader=new FXMLLoader();
          loader.setLocation(getClass().getResource("/uncooked/view/addMeat.fxml"));
        Parent root=loader.load();
        addMeatCtrl itemsCtrl=loader.getController();
    //  itemsCtrl.setMainApp(this);
        Scene scene=new Scene(root,1024,768);
        stage1.setScene(scene);
        stage1.show();
    } catch(Exception e){
        e.printStackTrace();
    }

}

addItemsController将加载另一个页面addMeat。我得到了它的工作,但当我尝试从addMeat返回addItems与按钮句柄,它不起作用。它与检索mainApp的阶段有关吗?我该如何解决这个问题?

这就是我尝试过的。

public void handleBackFromMeat(ActionEvent event) {
try{
    Stage stage=mainApp.getStage();
    FXMLLoader loader=new FXMLLoader();
    loader.setLocation(getClass().getResource("/uncooked/view/addItems.fxml"));
    Parent root=loader.load();
    addItemsController itemsCtrl=loader.getController();
    Scene scene=new Scene(root,1024,768);
    stage.setScene(scene);
    stage.show();
}catch (Exception e){
    e.printStackTrace();
}


}

1 个答案:

答案 0 :(得分:1)

我也发了一个类似的问题,然后我继续我的方式

I need to create a back button functionality in javafx?

我可以为我的应用程序做的是在应用程序的开头创建两个静态列表,然后使用fxml填充它和Stage和Fxml页面名称然后使用中央后退按钮方法每个页面通过迭代添加到列表中的最后一项来移动上一页。

主类中的两个静态列表

public static List<Stage>stageval = new ArrayList<Stage>();
public static List<String>fxmlval = new ArrayList<String>();

当我切换我的fxml视图时,我将舞台和fxml文件名添加到各自的列表中。

fxmlval.add("Instance.fxml");                                   
stage = (Stage)validate.getScene().getWindow();
stageval.add((Stage) delete.getScene().getWindow());

一个中央后退按钮方法,当用户点击后退按钮时,我迭代到两个列表的最后一项,然后在更改阶段后删除列表中的值。

public class BackButton {

    public void back(String instance,Stage stage) throws IOException{
                    Parent parent = FXMLLoader.load(getClass().getResource(instance));
                    Scene scene = new Scene(parent);
                    scene.getStylesheets().add("/css/Style.css");
                    stage.setResizable(false);
                    stage.setScene(scene);
                    stage.show();
    }
}

@FXML
public void back() throws IOException {
    BackButton bb = new BackButton();

    bb.back(fxmlval.get(fxmlval.size() - 1),        
    stageval.get(stageval.size() - 1));
    fxmlval.remove(fxmlval.size() - 1);
    stageval.remove(stageval.size() - 1);
}

希望这有助于解决问题,但解决方案有效。