当节点变得不可见时,使用ReactFX调整舞台大小?

时间:2015-06-09 14:36:07

标签: javafx javafx-8 rx-java reactfx

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

我通过遍历每个节点创建了一些嵌套闭包,每个EventStream创建visibleProperty(),然后订阅操作以切换managedProperty()并调用sizeToScene()。虽然我的解决方案有效但感觉不太干净。我觉得我应该使用平面图或其他东西。有没有更纯粹的反应方式来实现这个?

    gridPane.getChildren().stream().forEach(c -> {
         EventStreams.changesOf(c.visibleProperty()).subscribe(b -> {
             c.managedProperty().set(b.getNewValue());
             primaryStage.sizeToScene();
         });
    });

1 个答案:

答案 0 :(得分:1)

我将假设SELECT P.* FROM PrimaryTable AS P WHERE P.PrimaryTableID NOT IN (SELECT PrimaryTableID FROM SecondaryTable) OR P.PrimaryTableID IN (SELECT PrimaryTableID FROM SecondaryTable WHERE Name<>'xxx' AND Value<>'yyy') 的子列表已修复,因为在您的代码中,您只需迭代一次。

首先,为什么不将每个孩子的绑定 gridPane添加到managedProperty

visibleProperty

要在任何孩子更改其可见性时收到通知,您可以构建并观察单个gridPane.getChildren().stream().forEach(c -> { c.managedProperty().bind(c.visibleProperty()); });

EventStream

由于我们假设子列表是固定的,因此您可以使用稍微简单的东西:

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());

所有这一切,我会考虑找到一个不会篡改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

由于在JavaFX中使用弱侦听器,您可能需要存储对// 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); 的引用以防止它被垃圾回收。