3

我想根据文本字段是否包含任何内容来启用或禁用按钮,并且我想通过使用属性绑定来实现这一点。

所以起初我在文本字段的 text 属性上使用了 isEmpty() 方法来为按钮的 disabled 属性创建一个布尔绑定:

startSearchButton.disableProperty().bind(searchField.textProperty().isEmpty());

虽然绑定有效,但我对“文本字段包含任何内容”的定义与 isEmpty() 方法所做的不同,即仅检查文本的长度是否 > 0。但是,我对是否存在“真实”文本感兴趣,即文本字段是否为空白(不仅不为空,而且实际上不仅是空格)。

不幸的是,没有方法 isBlank(),而且我在 Bindings 实用程序类中也找不到任何合适的方法。现在我看到您可以通过 Bindings.createBooleanProperty 方法实现任何您喜欢的自定义布尔属性,但我还不熟悉定义自定义绑定的概念。我将如何为我的案例实现这样的布尔属性?

4

2 回答 2

9

您可以使用(在许多方法中)创建自定义绑定Bindings.createBooleanBinding(...)。第一个参数是一个计算绑定值的函数(您可以从文本中修剪空白,trim()然后检查结果是否为空);其余参数是触发绑定重新计算的可观察对象列表。您想在文本字段中的文本更改时重新计算绑定,因此只需指定 text 属性:

startSearchButton.disableProperty().bind(Bindings.createBooleanBinding(() -> 
    searchField.getText().trim().isEmpty(),
    searchField.textProperty());
于 2016-03-11T19:27:23.970 回答
-1

你也可以这样做:

  1. 使用 Apache StringUtils.isBlank()

    startSearchButton.disableProperty().bind(Bindings.createBooleanBinding(() -> 
        StringUtils.isBlank(searchField.getText()),
        searchField.textProperty());
    
  2. 创建你自己的方法

    public static boolean IsNullOrWhitespace(String s) {
            if(s == null) {
                return true;
            }
    
            for(int i = 0; i < s.length(); ++i) {
                if(!Character.isWhitespace(s.charAt(i))) {
                    return false;
                }
    
            }
            return true;
        }
    

进而:

    startSearchButton.disableProperty().bind(Bindings.createBooleanBinding(() -> 
            IsNullOrWhitespace(searchField.getText()),
            searchField.textProperty());
于 2018-09-17T19:22:09.323 回答