基于 ObservableList 的 TreeView 给出了不良结果
TreeView based on ObservableList gives undesirable result
ObservableList obList 有一个侦听器,添加后它会更新 TreeView。当新字符串 "music" 添加到 obList 时,将创建新项目并将其放入树视图中。该项目呈现为“{ [music] added at 0 }”而不是预期的 "music".
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似乎包含字符串和额外信息。这是怎么回事,我该怎么办?
如果你不使用原始类型,编译器会抱怨这个问题。
您在下一行中将值设置为 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);
}
}
}
好的,我修复了它:
obList.getAddedSubList().forEach(l ->
TreeItem<String> temp = new TreeItem(l);
tree.getRoot().getChildren().add(temp);
});
ObservableList obList 有一个侦听器,添加后它会更新 TreeView。当新字符串 "music" 添加到 obList 时,将创建新项目并将其放入树视图中。该项目呈现为“{ [music] added at 0 }”而不是预期的 "music".
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似乎包含字符串和额外信息。这是怎么回事,我该怎么办?
如果你不使用原始类型,编译器会抱怨这个问题。
您在下一行中将值设置为 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);
}
}
}
好的,我修复了它:
obList.getAddedSubList().forEach(l ->
TreeItem<String> temp = new TreeItem(l);
tree.getRoot().getChildren().add(temp);
});