呈现对象时的 javaFX 事件

Dad*_*dje 5 java javafx event-handling javafx-8

当显示场景/舞台中的所有对象时,我想被事件注意到。这听起来像是 JavaFX 不提供此功能。我对吗 ?

我解释原因:

我必须根据 TableView 滚动位置更新场景的其他对象。因此,我正在使用以下方法查找 TableView 的 VirtualScrollBar:

tableView.lookupAll(".scroll-bar")
Run Code Online (Sandbox Code Playgroud)

仅在实际呈现 TableView 后才返回所需的 ScrollBar。在“初始化”块中为空。

架构:我使用的是一个通用框架 - 我想说 - 包含一个空的 Pane 更新运行时,其中包含给定我想要显示的页面的实际内容。因此,我知道内容何时更新,但大部分时间是在呈现 TableView 之前,这会阻止我获取 ScrollBar 引用。

TableView 是“页面”的一部分,并添加到内容窗格中,舞台本身没有更新。

我正在使用 Oracle JDK8。

你知道我可以在哪里解决这个问题吗?在此先感谢您的帮助。

Lit*_*ild 5

您需要使用类的setOnShown()方法StageStage可见时收到通知。一旦可见,所有控件都已创建。文档说如下:

public final void setOnShown(EventHandler<WindowEvent> value)
Run Code Online (Sandbox Code Playgroud)

设置属性 onShown 的值。

属性描述:
在窗口显示后立即调用。


Dad*_*dje 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
                    }
                });
            }
        }
    });
Run Code Online (Sandbox Code Playgroud)