代码之家  ›  专栏  ›  技术社区  ›  Tranquility

FX使用不同的更改侦听器评估ListView是否为空

  •  1
  • Tranquility  · 技术社区  · 9 年前

    我想评估ListView是否为空以禁用或启用提交按钮。因此,本质上,当ListView没有内容时,按钮被禁用,当它有1个或多个元素时,它被启用。

    我成功地使用ListChangeListener实现了这一点,使用的代码如下:

    vp.addListChangeListener(change -> {
            change.next(); 
    
            if (change.getList().size() == 0 && change.wasRemoved() || change.getList().size() == 1 && change.wasAdded()) {
                bp.toggleSubmitAvailability("submit");
            }
        });
    

    其中addListChangeListener方法如下:

    public void addListChangeListener(ListChangeListener<Name> listener) {
        names.addListener(listener);
    }
    

    我理想中想做的只是使用传统的ChangeListener并侦听与ListView关联的属性之一。举个例子,我认为这可能有效:

    vp.addItemsListener((observable, oldValue, newValue) -> {
    
            if (newValue.size() == 0 && oldValue.size() > 0 || newValue.size() == 1 && oldValue.size() == 0) {
                bp.toggleSubmitAvailability("submit");
            }
        });
    

    其中addItemsListener方法如下(并将侦听器附加到itemsProperty):

    public void addItemsListener(ChangeListener<ObservableList<Name>> listener) {
            listView.itemsProperty().addListener(listener);
        }
    

    然而,由于某些原因,当我向ListView添加项,或者向附加到它的ObservableList添加项时,这个属性没有被更改,因为什么都没有发生-所以实际上是什么触发了ListView的itemsProperty更改,如果这种方法不起作用,有没有一种方法可以像我对ListChangeListener所做的那样,通过使用与ListView关联的另一个属性(当然是以一种相当优雅的方式)?

    1 回复  |  直到 9 年前
        1
  •  4
  •   James_D    9 年前

    这个 itemsProperty() 是保存列表本身的属性;使用它注册的侦听器将收到通知 listView.setItems(...) ,(即如果列表引用本身已更改),但如果修改 所容纳之物 它包含的列表的 listView.getItems().add(...) ).

    这个 Bindings 类提供了 isEmpty(ObservableList) 您可以在此处使用的方法:

    button.disableProperty().bind(Bindings.isEmpty(listView.getItems()));
    

    或者等效地与听众:

    Bindings.isEmpty(listView.getItems()).addListener(
        (obs, wasEmpty, isNowEmpty) -> button.setDisable(isNowEmpty));
    

    所以你可以实现这样的方法:

    public void addEmptyListListener(ChangeListener<Boolean> listener) {
        Bindings.isEmpty(listView.getItems()).addListener(listener);
    }
    

    然后做

    vp.addEmptyListListener((obs, wasEmpty, isNowEmpty) -> {
        // ...
    });