我试图动态地将条目添加到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
。我猜你可以从这一点开始猜测模式
此代码段取自我的控制器:
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
并重新填充,但它似乎无法正常工作。有没有人知道我失踪了什么?
{ [com.example.d3project.model.Graph@7eb5106] added at 0 }
{ [com.example.d3project.model.Graph@f510ff2] added at 1 }
{ [com.example.d3project.model.Graph@69239a8d] added at 2 }
输出显示了我期待看到的内容。 size()
的{{1}}也是我所期待的。
答案 0 :(得分:1)
您正在使用removeAll(E...),您需要传递要删除的对象。由于您没有传递任何参数,因此不会删除任何内容。要清除列表,请使用clear()删除历史记录列表中的所有项目。