JavaFX将正确的数据从一个控制器返回到另一个控制器

时间:2016-05-27 08:43:06

标签: java javafx

我有两个控制器。一个控制器管理大部分主要功能,另一个控制器控制一个简单的弹出提示,从主控制器访问。

这是存储在主控制器中的功能,用于访问提示符。

public void deletePrompt(){
    DeletePromptController controller = new DeletePromptController();
    boolean result = controller.showPrompt("/MainWindow//DeletePrompt.fxml");
    if(result){
        System.out.println("Deleted");
    }else{
        System.out.println("Canceled");
    }
}

这是提示控制器

public class DeletePromptController extends ShowWindow {
    public Label question;
    public Button delete, cancel;
    private boolean result = true;

    boolean showPrompt(String path){
        showWindow(path);
        return result;
    }

    public void delete(){
        System.out.println("D");
        result = true;
        Stage stage = (Stage) delete.getScene().getWindow();
        stage.close();
    }

    public void cancel(){
        System.out.println("C");
        result = false;
        Stage stage = (Stage) cancel.getScene().getWindow();
        stage.close();
    }
}

这是用于加载和显示删除提示fxml文件的块。

public class ShowWindow {
    public void showWindow(String path){
        try {
            FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource(path));
            Parent root = fxmlLoader.load();
            Stage stage = new Stage();
            stage.initModality(Modality.APPLICATION_MODAL);
            stage.setScene(new Scene(root));
            stage.showAndWait();
        }catch(IOException ex){
            ex.printStackTrace();
        }
    }
}

除了一件事,一切都在起作用。从提示控制器获取结果时,主控制器无法获得正确的布尔结果。

按下删除时的输出:

D
Canceled

按下取消时的输出:

C
Canceled

D后面应该是Deleted。

一切都有帮助。

1 个答案:

答案 0 :(得分:1)

FXMLLoader创建一个新的控制器实例,因为fxml中提供了fx:controller属性。

你基本上有两个选择:

  1. 从fxml中删除fx:controller属性并自行指定控制器:

    public void showWindow(String path){
        try {
            FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource(path));
            fxmlLoader.setController(this);
            Parent root = fxmlLoader.load();
    

  2. 获取FXMLLoader

    创建的控制器
    public static <T> T showWindow(String path){
        try {
            FXMLLoader fxmlLoader = new FXMLLoader(ShowWindow.class.getResource(path));
            Parent root = fxmlLoader.load();
            Stage stage = new Stage();
            stage.initModality(Modality.APPLICATION_MODAL);
            stage.setScene(new Scene(root));
            stage.showAndWait();
            return fxmlLoader.getController();
        }catch(IOException ex){
            ex.printStackTrace();
        }
        return null;
    }
    
    boolean showPrompt(String path) {
        return ShowWindow.<DeletePromptController>showWindow(path).result;
    }