2016-03-22 49 views
0

我試圖動態添加條目到JavaFX菜單。我有一個可以繪製圖形的程序,每次繪製新圖形時,我都會在所有圖形中添加一個條目到ObservableList
我的controller觀察列表,並且在每次更改時,都應該修改中的Menu。不過,我這樣做時遇到問題。
在第一次添加時,它按預期方式顯示the first entry
第二次添加時,該列表包含the first entry + the first entry + the last entry
第三次添加時顯示first entry + the first entry + the second entry + the first entry + the second entry + the last entry。我想你可以從這個角度猜測這個模式。
這段代碼是從我的控制採取:將動態條目添加到JavaFX中的菜單

graphHandler.getGraphs().addListener(new ListChangeListener<Graph>() { 
//GraphHandler.class is my model, that holds the list with all graphs 
    @Override 
    public void onChanged(Change<? extends Graph> c) { 
     Menu history = graphView.getHistoryMenu(); 
     history.getItems().removeAll(); 
     //on change get the Menu from the model and empty it 
     String changes = (String) c.toString(); 
     System.out.println(changes); 
     //Output will be added below snippet 
     graphHandler.getGraphs().forEach((Graph graph) -> { 
      String root = graph.getRootNode().toString(); 
      MenuItem item = new MenuItem(root); 
      //Get the graph's root node name and add a MenuItem with it's name 
      item.setOnAction(new EventHandler<ActionEvent>() { 
      //On choosing a MenuItem load the according graph; works fine 
       @Override 
       public void handle(ActionEvent event) { 
        graphHandler.getGraphByRootNode(root); 
       } 
      }); 
      history.getItems().addAll(item); 
      //Add all MenuItems to the Menu 
     }); 
    } 
}); 

我的方法是空的每一個變化的Menu和填充它,但它似乎並沒有工作。有人有一個想法我失蹤了嗎?

{ [[email protected]] added at 0 } 
{ [[email protected]] added at 1 } 
{ [[email protected]] added at 2 } 

輸出顯示了我期待看到的內容。 ObservableListsize()正如我所期待的那樣。

回答

1

您正在使用removeAll(E...),您需要傳遞要刪除的對象。既然你沒有通過任何論證,什麼都不會被刪除。要清除列表,請使用clear()這將刪除歷史記錄列表中的所有項目。

+0

一旦嘗試傳遞'graphHandler.getGraphs()'作爲參數,就無法工作。感謝您的解決方案:) –

相關問題