5

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

我解释为什么:

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

tableView.lookupAll(".scroll-bar")

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

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

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

我正在使用 Oracle JDK8。

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

4

3 回答 3

5

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

public final void setOnShown(EventHandler<WindowEvent> value)

设置属性 onShown 的值。

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

于 2013-11-05T09:10:00.773 回答
4

没有这样的事件可用。但是,您可以覆盖layoutChildren()并触发所有侦听器。

private boolean isRendered = false;
protected void layoutChildren() {
    super.layoutChildren();
    if(!isRendered){
        //This is the first time the node is rendered. Event trigger logic should be here
    }
    isRendered = true;
}
于 2017-03-16T05:22:39.497 回答
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 回答