JavaFX:在准备好数据之前禁用大多数Stage

时间:2018-08-24 22:54:00

标签: java javafx data-binding

我面临的是非常简单但普遍的问题。

问题设置

我有带有主窗口(主阶段)的 JavaFX 应用程序。此阶段适用于 some (保持常规)数据。可以在启动时以某种方式加载数据(例如,从服务器,数据库,XML文件)。数据源(服务器地址,数据库名称,XML文件路径)将提示用户。 (请记住,该用户可以取消输入,并且不会加载数据。)

因为我想向用户展示舞台(了解应用程序并可能浏览帮助​​),然后通过菜单File -> Load data,让他加载数据。

但是由于阶段主要取决于数据,因此我需要禁用大多数控件,直到用户正确加载数据并使阶段可用为止。

问题

这里出现了我无法解决的难题。 AFAIK,我有两个选择,如何在数据准备妥当之前如何禁用大多数舞台:

  1. 由于“或未加载数据”而禁用绑定

    更友好的JavaFX绑定解决方案是具有布尔属性,例如dataNotReadyProperty,然后在控制器初始化时使用类似以下的东西:

     private void init() { // call from initialize method
       // ....
       doFooButton.disableProperty().bind(
         Bindings.or(
           dataProperty().get().cannotBeFooDoneProperty(),
           dataNotReadyProperty()
         )
       );
       // ....
     }
    

如您所见,这段代码非常丑陋且冗长(特别是当某些控件的功能障碍由附加的orand造成时)。

  1. 在数据就绪后禁用并绑定

    第二个选项是在启动时(甚至在FXML中)完全禁用所有功能。并为dataProperty设置更改侦听器,并在加载数据时进行绑定的正确初始化。用代码编写:

     private void init() { // call from initialize method
       // ....
       doFooButton.setDisabled(true);
       // ....
       dataProperty().addListener((observable, oldValue, newValue) -> {
         if (oldValue == null && newValue != null) {
           runInitialization();
         }
       });
     }
    
     private void runInitialization() {
       // ....
       doFooButton.disableProperty().bind(
         dataProperty().get().cannotBeFooDoneProperty());
       // ....
     }
    

此解决方案将初始化分为两部分,但此处的“真实”初始化保持简单易懂。另外,我被迫两次修改每个控件。

结论

您想要什么?您还有其他建议,如何解决这种情况?

其他信息

  • 与禁用属性的绑定相比,该阶段确实需要更多的初始化
  • 一旦加载了数据,就无法“卸载”(只能由其他人重新加载)
  • 大约有。启动时将禁用20个控件,而访问时将禁用4个控件。

1 个答案:

答案 0 :(得分:0)

最后,我决定根据@ItachiUchiha的答案使用解决方案。

我创建了两个不同的窗格,一个用于正确处理数据,另一个创建有标签,例如:“加载数据以开始工作”和加载按钮。

其余(仅约5个)控件已通过绑定(选项1)禁用/启用。因此,“丑陋”的代码数量迅速减少。