2017-03-08 53 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));