JavaFX 将正确的数据从一个 Controller 返回到另一个 Controller

标签 java javafx

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

这是存储在主 Controller 中的函数,用于访问提示符。

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");
    }
}

这是提示 Controller

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 文件的 block 。

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();
        }
    }
}

除了一件事之外,一切都正常。主 Controller 从提示 Controller 获取结果时没有得到正确的 boolean 结果。

按下删除键时的输出:

D
Canceled

按下取消时的输出:

C
Canceled

D 后面应该是已删除。

任何事情都有帮助。

最佳答案

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

你基本上有两个选择:

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

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

  2. 获取由FXMLLoader创建的 Controller

    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;
    }
    

关于JavaFX 将正确的数据从一个 Controller 返回到另一个 Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37478859/

相关文章:

java并发: flag/event

javafx - 在 netbeans 中执行时,场景构建器中导入的图像不会显示

java - 输入值少于数组长度

java - Spring 3 和 JPA 使用 JTATransactionManager,但事务管理器无法提交

java - 检查字符串是否包含位于正确位置的子字符串

java - 使用 BCEL 生成的解析字节码确定对象之间的传出耦合(CBO 指标)

java - 如何在 lblText.steText() 中设置预定义消息

java - 制作JavaFX WebView环境的HTML和CSS "aware"

C++ 中的 Java JNI 启动器 : Works without JavaFX, 带有 JavaFX 的核心转储

JavaFX : Pass multiple parameters to eventhandler