0

複雑なコンテキストに基づいてコンポーネントを表示および非表示にする JavaFX ダッシュボードがあるため、ReactFX はこのための優れたユーティリティです。

EventStream各ノードをループし、 off eachを作成してからvisibleProperty()、操作をサブスクライブしてmanagedProperty()と callを切り替えることで、ネストされたクロージャーをいくつか作成しましたsizeToScene()。私のソリューションは機能しますが、あまりきれいではありません。フラットマップか何かを使用する必要があるように感じます。これを実装するためのより純粋に反応的な方法はありますか?

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

1 に答える 1

1

gridPaneコードでは一度反復するだけなので、子リストは固定されていると想定します。

まず、各子をその にバインド してみませんか?managedPropertyvisibleProperty

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ます。
編集:たとえば、可視プロパティで子のリストをフィルタリングします。

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

visibleChildrenJavaFX では弱いリスナーが使用されているため、ガベージ コレクションを防ぐために参照を格納する必要がある場合があります。

于 2015-06-09T17:31:33.930 に答える