我面临的是非常简单但普遍的问题。
我有带有主窗口(主阶段)的 JavaFX 应用程序。此阶段适用于 some (保持常规)数据。可以在启动时以某种方式加载数据(例如,从服务器,数据库,XML文件)。数据源(服务器地址,数据库名称,XML文件路径)将提示用户。 (请记住,该用户可以取消输入,并且不会加载数据。)
因为我想向用户展示舞台(了解应用程序并可能浏览帮助),然后通过菜单File -> Load data
,让他加载数据。
但是由于阶段主要取决于数据,因此我需要禁用大多数控件,直到用户正确加载数据并使阶段可用为止。
这里出现了我无法解决的难题。 AFAIK,我有两个选择,如何在数据准备妥当之前如何禁用大多数舞台:
更友好的JavaFX绑定解决方案是具有布尔属性,例如dataNotReadyProperty
,然后在控制器初始化时使用类似以下的东西:
private void init() { // call from initialize method
// ....
doFooButton.disableProperty().bind(
Bindings.or(
dataProperty().get().cannotBeFooDoneProperty(),
dataNotReadyProperty()
)
);
// ....
}
如您所见,这段代码非常丑陋且冗长(特别是当某些控件的功能障碍由附加的or
或and
造成时)。
第二个选项是在启动时(甚至在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());
// ....
}
此解决方案将初始化分为两部分,但此处的“真实”初始化保持简单易懂。另外,我被迫两次修改每个控件。
您想要什么?您还有其他建议,如何解决这种情况?
答案 0 :(得分:0)
最后,我决定根据@ItachiUchiha的答案使用解决方案。
我创建了两个不同的窗格,一个用于正确处理数据,另一个创建有标签,例如:“加载数据以开始工作”和加载按钮。
其余(仅约5个)控件已通过绑定(选项1)禁用/启用。因此,“丑陋”的代码数量迅速减少。