我正在尝试创建一个小型 JavaFX 应用程序。
我想做的是: 我的应用程序有一个 TextField,用户可以在其中插入 url。然后单击按钮加载页面。我想要做的是在文本字段为空或页面加载时禁用此按钮。当页面加载完成后,该按钮将再次启用。
我使用绑定(bind)将 TextField 与按钮绑定(bind),因此当 TextField 为空时,按钮将被禁用,使用以下代码:
BooleanBinding booleanBind = new BooleanBinding() {
{
super.bind(url.textProperty());
}
@Override
protected boolean computeValue() {
return url.getText().isEmpty();
}
};
loadButton.disableProperty().bind(booleanBind);
现在我还想在页面加载时禁用该按钮。 为了加载页面,我使用下面的代码:
loadButton.setOnAction(new EventHandler<ActionEvent>() {
@Override public void handle(ActionEvent event) {
//loadButton.setDisable(true);
webEngine.load(url.getText());
}
});
评论后,您可以看到我在页面加载时禁用按钮的方式(我正在使用 ChangeListener 在 WebEngine 完成加载后再次启用它)。但现在我使用绑定(bind)将其与 TextField 绑定(bind),我无法像这样手动禁用它,因为我收到 java.lang.RuntimeException: Abound value无法设置。
错误。
如何使用绑定(bind)在页面加载时禁用按钮?
最佳答案
WebEngine
有一个方法来获取用于执行后台加载的 Worker
:WebEngine.getLoadWorker()
。 Worker
具有 running
属性(property)。使用此属性并通过 or 绑定(bind)将其与 TextField
的 text
属性是否为空结合起来。
BooleanBinding empty = textField.textProperty().isEmpty();
button.disableProperty().bind(empty.or(webEngine.getLoadWorker().runningProperty());
此外,如上所示,无需创建自己的 BooleanBinding
来保存 TextField
的空状态。 text
属性是一个StringProperty
,它扩展自StringExpression
。 StringExpression
类具有 isEmpty()
方法,该方法为您返回一个 BooleanBinding
。
关于JavaFX 与 ActionEvent 绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50784785/