TreeView на основе ObservableList дает нежелательный результат - PullRequest
0 голосов
/ 13 января 2019

ObservableList obList имеет прослушиватель, после добавления он обновляет TreeView. Когда в obList добавлена ​​новая строка «музыка», новый элемент создается и помещается в древовидное представление. Элемент отображается как "{[music] добавлено в 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 содержит строку и дополнительную информацию. Что происходит и что мне делать?

Ответы [ 2 ]

0 голосов
/ 13 января 2019

Хорошо, я исправил это с помощью:

obList.getAddedSubList().forEach(l ->
    TreeItem<String> temp = new TreeItem(l);
    tree.getRoot().getChildren().add(temp);
});
0 голосов
/ 13 января 2019

Если бы вы не использовали необработанный тип, компилятор жаловался бы на проблему.

Вы устанавливаете значение для объекта 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);
        }
    }  
}
...