【问题标题】:JavaFX correct way to open and close a Stage multiple timesJavaFX多次打开和关闭Stage的正确方法
【发布时间】:2020-11-24 16:01:49
【问题描述】:

问题: 我正在使用 JavaFx 开发客户端服务器桌面应用程序,一切正常,除了我发现当我点击主页上的按钮打开一个新阶段时,新阶段仅在我第一次打开它时加载数据。新阶段的初始化方法向服务器发送请求并接收返回其字段已加载到新阶段的对象。没有抛出异常,服务器始终正确发送对象(通过在控制台上打印其值进行测试)。

我的怀疑是,当我单击按钮打开一个新阶段时,它每次都会创建一个新的 FXML 加载器实例。我没有得到的原因是执行周期在我第一次打开阶段和以下阶段时总是相同的。

我终于尝试在第二个窗口中插入一个按钮,单击该按钮时,会在窗口上加载对象,并且当我多次打开窗口时也可以正常工作,但显然我不喜欢这个解决方案,会强制用户点击按钮来检索数据。

这是允许打开新阶段的 HomePage Controller 方法:

@FXML
void showSecondView(MouseEvent event) throws IOException {


               
                FXMLLoader loader = new FXMLLoader();

                loader.setLocation(Main.class.getResource("/View_FXML/generaRichiesta.fxml"));
                Pane secondPageLayout = loader.load();
                SecondController secCon = loader.getController();
             

                stage = new Stage();
                stage.setScene(new Scene(secondPageLayout));

             
                stage.setTitle("Second Stage");


                stage.show();

}

这是第二阶段的初始化方法

public void initialize(URL url, ResourceBundle resourceBundle) {
                         
        //sending request to server and calling the following function to update the
        //view withe the received object
        
       Platform.runLater(
            () -> {
               //setting the view node "textField" with the object received from server
               //if I print this value on console I always get the object correctly but
               //it is loaded only the first time. When i call this function from a button it always
               //works but I should do it manually
               textField.setText().receivedObject.toString(); 
              
            }
        );
}

我真的不明白问题可能是什么,我想可能是因为当我每次创建 FXMLLoader 对象时。

有什么建议吗?

谢谢

【问题讨论】:

  • 与往常一样的程序:minimal reproducible example 需要 ;)
  • 嗨,我知道生成一个可重复的示例会更好,但现在我已经完成了应用程序,所以我应该制作一个小原型以使其工作。我真的在为这个错误而苦苦挣扎,而且很难找到什么不起作用,因为它不会引发任何错误。我从您的个人资料中看到 Java 桌面应用程序是您的业务。我问我们是否可以私下联系以向您展示问题。如果我显得打扰了,我深表歉意。谢谢
  • 你有什么异常吗?确保您没有在任何地方吞下它们(包括失败的,例如Task,没有必要的代码来报告错误)。您是否添加了任何(可能是临时的)日志记录语句以确保您认为应该执行的代码实际上正在执行?您是否尝试过使用调试器单步执行代码,以准确查看哪里出了问题?
  • 是的,当然,我记录并调试了两个控制器,每个语句之间的循环总是相同的......这就是让我发疯的原因......我也会尝试调试客户端服务器循环即使记录器已经告诉我结果是一样的

标签: javafx stage fxmlloader


【解决方案1】:

我发现了错误,基本上我使用的是 Observable Pattern,每次我打开一个控制器时,我都会将控制器对象关联到一个 hashmap 中,并且不接受同类对象的其他插入。此外,每次我关闭第二阶段时,我都省略了删除以从地图中删除控制器的第一个实例,因此可观察模式仅发送更改通知,并且始终发送到创建的控制器的第一个实例,而不是后续实例是通过重新打开窗口创建的

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-07
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    相关资源
    最近更新 更多