首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当节点变得不可见时,使用ReactFX来调整节点的大小?

当节点变得不可见时,使用ReactFX来调整节点的大小?
EN

Stack Overflow用户
提问于 2015-06-09 14:36:06
回答 1查看 220关注 0票数 0

我有一个JavaFX仪表板,它隐藏并显示基于复杂上下文的组件,因此ReactFX是一个很好的实用工具。

我创建了一些嵌套的闭包,通过循环遍历每个节点,在每个visibleProperty()上创建一个visibleProperty(),然后订阅一个操作来切换managedProperty()并调用sizeToScene()。虽然我的解决方案有效,但感觉并不是很干净。我觉得我应该用个平面图什么的。是否有一种更纯粹的反应方式来实现这一点?

代码语言:javascript
复制
    gridPane.getChildren().stream().forEach(c -> {
         EventStreams.changesOf(c.visibleProperty()).subscribe(b -> {
             c.managedProperty().set(b.getNewValue());
             primaryStage.sizeToScene();
         });
    });
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-06-09 17:31:33

我将假设您的gridPane的子列表是固定的,因为在您的代码中,您只需要迭代一次。

首先,为什么不将每个子节点的managedProperty绑定到其visibleProperty上?

代码语言:javascript
复制
gridPane.getChildren().stream().forEach(c -> {
    c.managedProperty().bind(c.visibleProperty());
});

若要在任何子节点更改其可见性时得到通知,您可以构造并观察单个EventStream

代码语言:javascript
复制
LiveList.map(gridPane.getChildren(), c -> EventStreams.valuesOf(c.visibleProperty()))
        .reduce((es1, es2) -> EventStreams.merge(es1, es2))
        .orElseConst(EventStreams.never()) // for the case of no children
        .values().flatMap(Function.identity())
        .subscribe(b -> primaryStage.sizeToScene());

由于我们假设子列表是固定的,所以您可以使用一些稍微简单的方法:

代码语言:javascript
复制
gridPane.getChildren().stream().map(c -> EventStreams.valuesOf(c.visibleProperty()))
        .reduce((es1, es2) -> EventStreams.merge(es1, es2))
        .orElse(EventStreams.never()) // for the case of no children
        .subscribe(b -> primaryStage.sizeToScene());

尽管如此,我还是会考虑找到一种不篡改managedProperty的解决方案。

例如,编辑:,通过其子列表的可见属性过滤其列表:

代码语言:javascript
复制
// your (fixed) list of children
List<Node> children0 = ...;

// list of children that triggers list changes when children change their visibility
ObservableList<Node> children = FXCollections.observableList(
        children0, ch -> new Observable[]{ ch.visibleProperty() });

// children filtered by visibility
ObservableList<Node> visibleChildren = children.filtered(Node::isVisible);

// bind GridPane's children to visible children
Bindings.bindContent(gridPane.getChildren(), visibleChildren);

由于在visibleChildren中使用弱侦听器,您可能需要存储对JavaFX的引用,以防止它被垃圾收集。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30735181

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档