一个ObservableList obList具有一个侦听器,此外,它还更新TreeView。在将新字符串“ music”添加到obList时,将创建新项目并将其放入树视图中。该项目呈现为“ {在0处添加[音乐]””,而不是预期的“音乐”。
TreeItem<String> root = new TreeItem();
root.setExpanded(true);
TreeView<String> treeView = new TreeView(root);
treeView.getChildren().add(new TreeItem<String>("cat")); // normal behaviour
obList = FXCollections.observableArrayList();
obList.addListener(new ListChangeListener<String>() {
@Override
public void onChanged(ListChangeListener.Change<? extends String> c) {
while (c.next()) {
if (c.wasAdded()) {
TreeItem<String> temp = new TreeItem(c);
tree.getRoot().getChildren().add(temp);
}
}
});
obList.add("music");
似乎变量c包含字符串和其他信息。发生了什么,我该怎么办?
答案 0 :(得分:1)
如果您不使用原始类型,则编译器会抱怨该问题。
在下一行中,将值设置为ListChangeListener.Change
对象,而不是String
。使用右侧的原始类型可以删除可能导致编译时错误的类型检查。
TreeItem<String> temp = new TreeItem(c);
相反,要遍历已添加项目的列表,并为所有项目添加TreeItem
:
while (c.next()) {
if (c.wasAdded()) {
for (String element : c.getAddedSubList()) {
TreeItem<String> temp = new TreeItem<>(element);
tree.getRoot().getChildren().add(temp);
}
}
}
答案 1 :(得分:0)
好,我用:
obList.getAddedSubList().forEach(l ->
TreeItem<String> temp = new TreeItem(l);
tree.getRoot().getChildren().add(temp);
});