5

シーン/ステージ内のすべてのオブジェクトが表示されたときにイベントで通知されたいです。これは、JavaFX がこの機能を提供していないように思えます。私は正しいですか?

その理由を説明します。

TableView のスクロール位置に基づいて、シーンの他のオブジェクトを更新する必要があります。したがって、次を使用して、TableView の VirtualScrollBar を検索しています。

tableView.lookupAll(".scroll-bar")

TableView が実際にレンダリングされた後にのみ、目的の ScrollBar を返します。「初期化」ブロックではヌル。

アーキテクチャ: 私は共通のフレームを使用しています - 私が言うには - 表示したいページを指定して、実際のコンテンツを含む空のペイン更新ランタイムを含みます。したがって、コンテンツがいつ更新されるかはわかりますが、ほとんどの場合、TableView がレンダリングされる前であるため、ScrollBar 参照を取得できません。

TableView は「ページ」の一部であり、コンテンツ ペインに追加されます。ステージ自体は更新されません。

私はOracle JDK8を使用しています。

これを整理できる手がかりはありますか?よろしくお願いします。

4

3 に答える 3

5

が表示されたときに通知を受けるにsetOnShown()は、クラスのメソッドを使用する必要があります。表示されると、すべてのコントロールが作成されました。ドキュメントには次のように記載されています。 StageStage

public final void setOnShown(EventHandler<WindowEvent> value)

プロパティ onShown の値を設定します。

プロパティの説明:
Window が表示された直後に呼び出されます。

于 2013-11-05T09:10:00.773 に答える
1

答えを得るには:

私が今見つけた唯一の回避策は、重複を避けるために、TableView レンダリングとインスタンス変数の後に常にある、テーブル自体のアイテム監視可能リストにコールバックを追加することです。

table.getItems().addListener(new ListChangeListener<T>() {

        @Override
        public void onChanged(Change<? extends T> c) {
            if (tableScrollBar == null){
                tableScrollBar = lookupScrollBar(); 
                tableScrollBar.valueProperty().addListener(new ChangeListener<Number>() {

                    @Override
                    public void changed(ObservableValue<? extends Number> arg0, Number oldValue, Number newValue) {
                        // do my job
                    }
                });
            }
        }
    });
于 2013-11-06T07:48:33.673 に答える