2017-03-08 55 views
0

我想填充变量内容的Pane varPane。实现类似于这样JavaFX:窗格上的触发器不可见/销毁

Pane varPane = new Pane(); 
// .. 

someProperty.addListener((obsv, oldV, newV) -> { 
    varPane.getChildren().clear(); // Remove old Property Pane Content 
    Pane propPane = getNewPane(newV);  // Get new content 
    varPane.getChildren().add(propPane); // add Content 
}); 

产生的窗格状:

public Pane getNewPane(Object newV){ 
     Pane myPane = new Pane(); 

     // Add dummy Content 
     myPane.getChildren().add(new Label(newV.toString())) 

     // Here I need some listener 
     // somthing like [not working]: 
     myPane.setOnClosed(System.out.println("Pane closed: " + newV.toString()); 

     return myPane; 
} 

如上所示,我需要进行一些清理后的窗格中不再使用。但是我找不到纠正这种倾听者的方法。

  • varPane内容发生变化,旧的窗格是不可见的了,或者
  • 如果varPane被破坏(在如Platform.exit()

听者应,如果被触发

我可以要求在这些事件中调用一个函数进行清理。不过,我认为如果窗格自己检测到这样的事件会更安全。

回答

1

首先请注意varPane.getChildren().removeAll()不符合您的想法。您需要

varPane.getChildren().clear(); 

您可以检查是否窗格的parentProperty()变为空:

myPane.parentProperty().addListener((obs, oldParent, newParent) -> { 
    if (newParent == null) { 
     System.out.println("Pane closed: " + newV); 
    } 
}); 

检查是否含有窗格中的窗口隐藏(关闭)是相当困难。您可以创建的听众下列链(基本上听窗格的sceneProperty()为了听现场的windowProperty()为了监听器窗口的showingProperty()):

ChangeListener<Boolean> showingListener = (obs, wasShowing, isNowShowing) -> { 
    if (! isNowShowing) { 
     System.out.println("Window containing "+newV+" hidden"); 
    } 
}; 
ChangeListener<Window> windowListener = (obs, oldWin, newWin) -> { 
    if (oldWin != null) { 
     oldWin.showingProperty().removeListener(showingListener); 
    } 
    if (newWin != null) { 
     newWin.showingProperty().addListener(showingListener); 
    } 
}; 
ChangeListener<Scene> sceneListener = (obs, oldScene, newScene) -> { 
    if (oldScene != null) { 
     oldScene.windowProperty().removeListener(windowListener); 
     if (oldScene.getWindow() != null) { 
      oldScene.getWindow().showingProperty().removeListener(showingListener); 
     } 
    } 
    if (newScene != null) { 
     newScene.windowProperty().addListener(windowListener); 
     if (newScene.getWindow() != null) { 
      newScene.getWindow().showingProperty().addListener(showingListener); 
     } 
    } 
}; 
myPane.sceneProperty().addListener(sceneListener); 

您可能更愿意使用绑定框架,例如作为ReactFX的一部分。使用ReactFX,您可以覆盖两种情况:

EventStreams.changesOf(Val 
    .flatMap(myPane.sceneProperty(), Scene::windowProperty) 
    .flatMap(Window::showingProperty) 
    .orElseConst(false)) 
    .filter(c -> ! c.getNewValue()) 
    .observe(v -> System.out.println("Pane closed: "+newV));