JavaFX 与 ActionEvent 绑定(bind)

标签 java javafx

我正在尝试创建一个小型 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)将其与 TextFieldtext 属性是否为空结合起来。

BooleanBinding empty = textField.textProperty().isEmpty();
button.disableProperty().bind(empty.or(webEngine.getLoadWorker().runningProperty());

此外,如上所示,无需创建自己的 BooleanBinding 来保存 TextField 的空状态。 text 属性是一个StringProperty,它扩展自StringExpressionStringExpression 类具有 isEmpty() 方法,该方法为您返回一个 BooleanBinding

关于JavaFX 与 ActionEvent 绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50784785/

相关文章:

java - SSLContext 的 Selenium NoClassDefFoundError

Java Swing Group 的复选框多选处理程序

java - 获取嵌套实体数据导致 stackoverflow 错误

JavaFX : How to dynamically add textfields and buttons on user input

Java 将 MouseEvent 转换为 ActionEvent

java - 在 Spark Streaming 中将 StreamingContext 与 Receiver 分开

java - 将自定义对象从嵌入式 FX (JFXPanel) 拖放到 Swing

java - 使用 jdk11 和 Eclipse 2019-03 (4.11.0) 的基本 javafx11 应用程序的运行时错误

javafx - 如何使 Textarea 垂直滚动条始终处于事件状态?

JavaFX 一张一张显示多个gif