Я использую древовидную структуру в приложении javafx, и сегодня я добавил поддержку перетаскивания для изменения порядка элементов древовидной структуры.Чтобы сделать это, я должен был создать свой собственный класс CellFactory, но в моем коде есть ошибка.Когда содержимое моего древовидного представления становится меньше, область под древовидным представлением, которая должна быть пустой, все еще содержит текст, которого там быть не должно.
Вот как выглядит мое древовидное представление до свертывания и после свертывания:
до свертывания элемента
после свертывания элемента
Я получил вдохновение для функции перетаскивания из этого поста https://brianyoung.blog/2018/08/23/javafx-treeview-drag-drop/
До того, как у меня появился собственный класс cellFactory, у меня была лямбда-функция в методе setCellFactory моего дерева, и у этого решения такой проблемы не было.
В моем классе CellFactory я переопределяю метод вызова,Я думаю, что именно здесь мне нужно как-то обновить содержимое дерева, чтобы избавиться от остатка текста.
public class CellFactory implements Callback<TreeView<QuizElement>, TreeCell<QuizElement>> {
...
@Override
public TreeCell<QuizElement> call(TreeView<QuizElement> treeView) {
TreeCell<QuizElement> cell = new TreeCell<QuizElement>() {
@Override
protected void updateItem(QuizElement item, boolean empty) {
super.updateItem(item, empty);
if (item == null) return;
if (empty) {
setText("");
} else {
textProperty().bind(item.getNameProperty());
}
}
};
cell.setOnDragDetected((MouseEvent event) -> dragDetected(event, cell));
cell.setOnDragOver((DragEvent event) -> dragOver(event, cell));
cell.setOnDragDropped((DragEvent event) -> drop(event, cell, treeView));
cell.setOnDragDone((DragEvent event) -> clearDropLocation());
return cell;
}
...
На фотографии после свертывания я ожидал, что область под последним открываемым элементом будет белой.