当场景/舞台中的所有对象都显示时,我想通过事件引起注意。听起来JavaFX没有提供这个功能。我说得对吗?
我解释原因:
我必须根据TableView滚动位置更新场景中的其他对象。因此,我使用查找TableView的VirtualScrollBar
tableView.lookupAll(".scroll-bar")
其仅在实际渲染TableView之后才返回所需的滚动条。"initialize"块中为Null。
体系结构:我使用的是一个公共框架——我想说——包含一个空的Pane更新运行时,其中包含我想要显示的页面的实际内容。因此,我知道内容何时更新,但大多数时间都在TableView渲染之前,这使我无法获得ScrollBar引用。
TableView是"页面"的一部分,它被添加到内容窗格中,不更新后台文件本身。
我使用的是Oracle JDK8。
你知道我在哪里可以解决这个问题吗?提前感谢您的帮助。
当Stage
可见时,您需要使用Stage
类的setOnShown()
方法来得到通知。一旦它可见,所有控件都已创建。文件说明如下:
public final void setOnShown(EventHandler<WindowEvent> value)
将特性的值设置为onShown。
属性描述:
在窗口显示后立即调用。
没有这样的事件可用。但是,您可以覆盖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;
}
为了得到答案:
我现在找到的唯一解决方法是向表本身的项目可观察列表添加一个回调,该列表总是在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
}
});
}
}
});