parentNode() возвращает null при удалении нескольких дочерних узлов

Я не могу найти решение, почему мой Explorer Manager (либо BeanTreeView, либо OutlineView) в приложении NetBeans Platform 7.1 отлично работает с древовидной структурой при удалении одного узла, но не при удалении нескольких узлов. Проблема связана с обновлением дерева, а не с самим удалением. При вызове действия удаления (системного действия) он вызывает метод destroy() на моем узле:

@Override
public void destroy() throws IOException {
  //removing the business object
  ...

    try {
      IReloadableViewCapability rvc;
      if (getParentNode() != null) {
        rvc = this.getParentNode().getLookup().lookup(IReloadableViewCapability.class);
      }
      rvc.reloadChildren();
    } catch (Exception ex) {
      logger.log(Level.WARNING, null, ex);
    }

    fireNodeDestroyed();
}

И допустим, у меня есть такая структура:

  • Node 1
    • 1.1
    • 1.2
    • 1.3
  • Node 2
    • 2.1
    • ...

Теперь допустим, я хочу удалить узлы 1.1, 1.2 и 1.3. Я выбираю их все, вызываю действие удаления, и оно вызывает метод destroy() узла 1.1, где он удаляет для него данные и вызывает мой метод reloadChildren() для parentNode узла 1.1 (как показано в коде выше). Затем после удаления узла 1.2 он становится 1.3. Он удаляет удаляет данные для версии 1.3, но теперь getParentNode() возвращает значение null, хотя он снова должен возвращать узел 1.

Аналогичная проблема возникает при совместном удалении узла 1 и узла 2 (или любых других верхних узлов), хотя они являются дочерними элементами специального узла RootNode. Единственная разница в root заключается в том, что там все идет нормально только для первого узла, но, чем любой другой выбранный, не может найти своего родителя.

Где может быть проблема?


person Martin Vondráček    schedule 29.02.2012    source источник
comment
Ну, с другой стороны, кажется, что fireNodeDestroyed() не приводит к вызову переопределенного метода ndoeDestroyed в моей дочерней фабрике узлов, которая реализует NodeListener. Вот почему я вызываю reloadChildren и получаю реализацию IReloadableViewCapability, которая определена как анонимный класс как раз в этом же Node в конструкторе.   -  person Martin Vondráček    schedule 01.03.2012
comment
можете ли вы гарантировать, что родительский родительский узел не будет уничтожен в вашем вызове? Возможно, этот родитель является дочерним элементом другого узла, который является дочерним элементом родителя. Могли бы вы ввести циклическую зависимость e в свое дерево?   -  person Cris Stringfellow    schedule 01.03.2012
comment
Хорошая мысль, но я действительно считаю, что нет. Я пытался построить данные, из дерева генерируется несколько раз. И мое приложение пока позволяет добавить только еще одного ребенка, поэтому нет возможности создать сетевую иерархию вместо дерева. И если я вызову свое действие перезагрузки, которое перезагружает все дерево, тоже все в порядке. В любом случае, я отредактировал вопрос, так что теперь пример лучше понять.   -  person Martin Vondráček    schedule 01.03.2012
comment
После того, как вы удалили последнего потомка, к какому объекту привязан getParentNode()? Какой смысл может иметь вызов getParentNode(), когда все дочерние элементы удалены?   -  person Cris Stringfellow    schedule 01.03.2012
comment
Я вас не понимаю, или вы меня не понимаете. При удалении дочерних элементов с 1.1 по 1.3 я получаю нулевое значение от getParentNode() на 1.3 (которое я удаляю). И при удалении узлов на первом уровне (узел 1, 2...) я получаю право на второй в строке (так здесь, узел 2).   -  person Martin Vondráček    schedule 02.03.2012
comment
При удалении дочерних элементов с 1.1 по 1.3 я получаю нулевое значение от getParentNode(), вызванного в переопределенном методе уничтожения узла 1.3. В //удалении части кода бизнес-объекта я удаляю только объект из базы данных. Затем я пытаюсь в показанном коде перезагрузить дочерние элементы родительского узла (Node 1), чтобы узел 1.3 исчез из дерева. Я нигде не удаляю узел вручную, я просто вызываю DeleteAction.delete() с платформы NB, которая вызывает переопределенный метод destroy на удаляемом узле. И когда я удаляю все 3 узла один за другим, все работает нормально. Множественный выбор - это проблема.   -  person Martin Vondráček    schedule 02.03.2012


Ответы (2)


Лучшее решение этой проблемы — просто не вызывать parentNode, но немного изменить мою реализацию ChildFactory. My CHildFactory теперь также реализует NodeListener и в переопределенном методе nodeDestroyed вызывает только:

refresh(true);

Затем я добавил слушателя к созданному узлу:

@Override
protected Node createNodeForKey(Chapters key) {
    ChapterNode chapterNode = new ChapterNode(key);

    chapterNode.addNodeListener(this);
    return chapterNode;
}

И затем я изменил метод destroy() моего узла:

@Override
public void destroy() throws IOException {
    //removing the business object
    ...

    fireNodeDestroyed();
}
person Martin Vondráček    schedule 02.03.2012

Я думаю, что ваши элементы еще не были прикреплены к дереву домов. Вы должны сначала прикрепить их, например: document.body.appendChild(myElement); Затем вы можете удалить их в IE следующим образом: myElement.parentNode.removeChild(myElement);

person thooyork    schedule 19.10.2018