Я пытаюсь динамически добавлять записи в меню 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
, как я ожидаю.
После попытки передать аргумент 'graphHandler.getGraphs()' в качестве аргумента не работал. Спасибо за решение :) –