2016-03-22 6 views
0

Я пытаюсь динамически добавлять записи в меню JavaFX. У меня есть программа, которая может рисовать графики, каждый раз, когда рисуется новый график, я добавляю запись в файл ObservableList со всеми графиками.
Мой controller наблюдает за списком и при каждом изменении, он должен изменить Menu в JavaFX view. При этом я столкнулся с проблемой.
На первом добавлении оно отображается как ожидалось 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 } 

Выходные данные показывают, что я ожидал увидеть. Также size()ObservableList, как я ожидаю.

ответ

1

Вы используете removeAll(E...), где вы должны передать объекты, которые хотите удалить. Поскольку вы не проходите ни одного аргумента, ничего не будет удалено. Чтобы очистить список, используйте clear(), который удалит все элементы в вашем списке истории.

+0

После попытки передать аргумент 'graphHandler.getGraphs()' в качестве аргумента не работал. Спасибо за решение :) –

Смежные вопросы