呈现对象时的javaFX事件

时间:2013-11-05 09:04:34

标签: java event-handling javafx javafx-8

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

我解释原因:

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

查找TableView的VirtualScrollBar
tableView.lookupAll(".scroll-bar")

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

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

TableView是“页面”的一部分,并添加到内容窗格中,而不是在舞台上更新。

我正在使用Oracle JDK8。

你有什么线索可以解决这个问题吗? 在此先感谢您的帮助。

3 个答案:

答案 0 :(得分:4)

setOnShown()可见时,您需要使用Stage类的Stage方法进行通知。一旦可见,就会创建所有控件。文档说如下:

public final void setOnShown(EventHandler<WindowEvent> value)
  

设置属性onShown的值。

     

物业描述:
  在显示窗口后调用。

答案 1 :(得分: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
                    }
                });
            }
        }
    });

答案 2 :(得分:1)

这不是可用的事件。 但是,您可以覆盖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;
}