2016-03-22 3 views
0

Ich versuche, Einträge dynamisch zu einem JavaFX-Menü hinzuzufügen. Ich habe ein Programm, das Diagramme zeichnen kann, jedes Mal, wenn ein neues Diagramm gezeichnet wird, füge ich einen Eintrag zu einem ObservableList mit allen Diagrammen hinzu.
Meine controller beobachtet die Liste und bei jeder Änderung sollte es die Menu in der JavaFX view ändern. Allerdings habe ich ein Problem dabei.
Beim ersten Hinzufügen zeigt es wie erwartet the first entry.
Beim zweiten Hinzufügen enthält die Liste the first entry + the first entry + the last entry.
Auf der dritten fügen Sie die first entry + the first entry + the second entry + the first entry + the second entry + the last entry. Ich schätze, Sie können das Muster von diesem Punkt an erraten.
Dieser Code-Schnipsel aus meinem Controller genommen:Hinzufügen von dynamischen Einträgen zum Menü in 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 
     }); 
    } 
}); 

Mein Ansatz der Menu auf jeder Änderung leer war und füllen Sie ihn, aber es scheint nicht zu funktionieren. Hat jemand eine Idee was ich vermisse?

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

Die Ausgabe zeigt, was zu sehen erwarte ich. Auch die size() der ObservableList ist wie ich es erwarte.

Antwort

1

Sie verwenden removeAll(E...), wo Sie die Objekte übergeben müssen, die Sie entfernen möchten. Da Sie kein Argument übergeben, wird nichts entfernt. Um die Liste zu löschen, verwenden Sie clear(), wodurch alle Einträge in Ihrer Verlaufsliste gelöscht werden.

+0

Einmal versucht, 'graphHandler.getGraphs()' als Argument zu übergeben, hat nicht funktioniert. Danke für die Lösung :) –