Properties JavaFX-将侦听器添加到窗格中,以检查它是否正在显示

Properties JavaFX-将侦听器添加到窗格中,以检查它是否正在显示,properties,javafx,listener,javafx-8,show,Properties,Javafx,Listener,Javafx 8,Show,在过去的几个月里,我一直在研究JavaFX。我试图找到一种实现侦听器的方法,该侦听器在根窗格/场景上显示特定窗格时启动。在Java中,我可以使用如下所示的JPanel上的ancestorListener实现这一点,但在JavaFX上找不到等效的方法 JPanel panel = new JPanel (); panel.addAncestorListener ( new AncestorListener () { public void ancestorAdded ( AncestorE

在过去的几个月里,我一直在研究JavaFX。我试图找到一种实现侦听器的方法,该侦听器在根窗格/场景上显示特定窗格时启动。在Java中,我可以使用如下所示的JPanel上的ancestorListener实现这一点,但在JavaFX上找不到等效的方法

JPanel panel = new JPanel ();
panel.addAncestorListener ( new AncestorListener ()
{
    public void ancestorAdded ( AncestorEvent event ) {
        System.out.println("This panel is shown on screen now");
    }

    public void ancestorRemoved ( AncestorEvent event ){}

    public void ancestorMoved ( AncestorEvent event ){}
} );

您可以观察
sceneProperty()
。这将告诉您窗格(或任何其他节点)是否是场景图的一部分:

pane.sceneProperty().addListener((obs, oldScene, newScene) -> {
    if (newScene == null) {
        // not showing...
    } else {
        // showing ...
    }
});
如果要进一步查看窗格是否是正在显示的窗口中的场景图的一部分,可以使用:

EasyBind.select(pane.sceneProperty())
    .select(Scene::windowProperty)
    .select(Window::showingProperty)
    .orElse(false)
    .addListener((obs, wasShowing, isNowShowing) -> {
         if (isNowShowing) {
             // pane is showing in a window...
         } else {
             // pane is not showing in a window...
    });