JavaFX 8:判断ListView是否为空及监听状态禁用另一个ListView
问题1:如何在JavaFX 8中判断一个ListView是否为空?
在JavaFX里,ListView的内容完全依赖于它绑定的ObservableList数据源,所以判断它是否为空,本质就是检查这个集合有没有元素。你可以直接用下面的代码:
// 替换成你的ListView实例名 boolean isListViewEmpty = myListView.getItems().isEmpty();
如果返回true,就说明当前ListView没有任何可显示的内容。要是你需要判断的是可视化层面是否有渲染的元素(比如数据源非空但元素被过滤了),那可能要结合getChildrenUnmodifiable()去检查,但绝大多数业务场景下,检查数据源的isEmpty()就足够了。
问题2:监听第一个ListView的为空状态,控制第二个ListView的启用/禁用
这个需求用JavaFX的属性监听或绑定机制就能完美实现,给你两种常用方案:
方案一:属性绑定(最推荐,代码极简)
JavaFX的属性支持单向绑定,我们可以直接把第二个ListView的禁用状态和第一个ListView的数据源空状态绑定在一起,状态会自动同步:
// 假设你的两个ListView实例是firstListView和secondListView secondListView.disableProperty().bind(firstListView.getItems().isEmptyProperty());
一行代码搞定!此后只要firstListView的数据源变空,secondListView会自动禁用;一旦firstListView添加了元素,secondListView会立即恢复启用,完全不用手动维护状态。
方案二:手动添加ChangeListener
如果你需要在状态变化时做额外逻辑(比如打日志、触发其他操作),可以给firstListView的isEmptyProperty添加监听器,手动控制第二个ListView的状态:
firstListView.getItems().isEmptyProperty().addListener((observable, oldEmptyState, newEmptyState) -> { // newEmptyState为true时,first是空的,禁用second;反之启用 secondListView.setDisable(newEmptyState); // 这里还可以加其他自定义逻辑,比如打印日志 System.out.println("First ListView empty state changed: " + newEmptyState); });
另外,你也可以监听整个数据源集合的元素增删事件,每次变化时检查是否为空:
firstListView.getItems().addListener((ListChangeListener<? super YourDataType>) change -> { boolean isFirstEmpty = firstListView.getItems().isEmpty(); secondListView.setDisable(isFirstEmpty); });
不过这种方式需要每次集合变化都手动判断,不如属性绑定来得高效简洁。
内容的提问来源于stack exchange,提问作者Pakbert
相关产品推荐
相关产品推荐

