【问题标题】:JavaFX binding with ActionEventJavaFX 与 ActionEvent 的绑定
【发布时间】:2018-06-10 14:37:04
【问题描述】:

我正在尝试创建一个小型 JavaFX 应用程序。

我想要做的是: 我的应用程序有一个 TextField 用户导致插入一个 url。然后单击一个按钮来加载页面。我想要做的是在 TextField 为空或页面加载时禁用此按钮。页面加载完成后,按钮再次启用。

我使用绑定将 TextField 与按钮绑定,因此当 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 完成加载后再次启用它)。但是现在我使用绑定也将它与 TextField 绑定,我不能像这样手动禁用它,因为我收到 java.lang.RuntimeException: A bound value cannot be set. 错误。

如何在页面加载时使用绑定来禁用按钮?

【问题讨论】:

    标签: java javafx


    【解决方案1】:

    WebEngine 具有获取用于执行后台加载的Worker 的方法:WebEngine.getLoadWorker()Worker 具有 running 属性。使用此属性并通过 or 绑定将其与TextFieldtext 属性是否为空结合起来。

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

    另外,如上所示,无需创建自己的BooleanBinding 来保持TextField 的空状态。 text 属性是从 StringExpression 扩展而来的 StringPropertyStringExpression 类具有 isEmpty() 方法,该方法为您返回 BooleanBinding

    【讨论】:

    • 是的,我尝试了 runningProperty,但按钮没有关闭。也许我做错了什么。我决定通过使用文本字段属性间接地做到这一点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-02
    • 2016-01-08
    • 2016-06-11
    • 2014-01-09
    • 1970-01-01
    • 1970-01-01
    • 2012-07-28
    相关资源
    最近更新 更多