Проблема с вставкой заметок в JTree - PullRequest
0 голосов
/ 29 января 2011

У меня есть JTree, который построен следующим методом:
(Класс BKMNode расширяет DefaultMutableTreeNode, а DataNode просто хранит данные)

 void populateTree(BKMNode parent) {
    for (DataNode node : nodes) {
        BKMNode treeNode = new BKMNode(node.name,node.fullName,null);
        // check if this node was already added before
        if (! existingNodes.contains(ip + "." + node.fullName)) {
            existingNodes.add(ip + "." + node.fullName);
            DefaultTreeModel model = (DefaultTreeModel)tree.getModel();
            model.insertNodeInto(treeNode, parent, parent.getChildCount());
            System.out.println("adding " + ip + "." + node.fullName);
        }
        node.populateTree(treeNode);
    }

// some more non-relevant code...

Когда дерево создается при запуске приложения, все в порядке.
Но время от времени мое приложение добавляет узлы в дерево одним и тем же методом.
Когда приложение пытается добавить новый узел в дерево, оно печатает текст, но ничего не меняется в GUI.
Я пытался позвонить JTree.invalidate(), validate(), repaint(), reload(), но ничего не помогло.

Метод populateTree всегда вызывается из EDT.

Кто-нибудь знает, в чем здесь проблемы?

Заранее большое спасибо!

Ответы [ 2 ]

3 голосов
/ 29 января 2011

Поверьте мне, я пытался использовать каждый метод проверки, подтверждения, перекраски, перезагрузки

Извините, я не верю вам, люди все время делают глупые ошибки.Вот почему нам нужен SSCCE, чтобы точно знать, что вы делаете.Сказав это, нет никаких причин для вызова любого из этих методов.invalidate (), validate () используются при добавлении / удалении компонентов из контейнера, что вы еще не сделали.Когда вы обновляете модель, она отвечает за уведомление о представлении, чтобы оно могло перекрашиваться.

, но в графическом интерфейсе ничего не меняется

Что вы ожидаетеменять?

Вставка узла вставляет узел в модель.Если родительский узел расширен, то да, вы должны увидеть вставленный узел.Однако, если родительский узел свернут, вы не увидите изменений.

Если вы хотите увидеть узел после его вставки, вы можете использовать метод tree.expandPath (...).

Базовый код, который вы разместили, отлично работает для меня, когда я вставляюузел по умолчанию, содержащий строковое значение.Может быть, проблема в вашем пользовательском узле?Поэтому первое, что вам нужно сделать, это создать SSCCE, который работает с узлом по умолчанию.Как только это сработает, вы замените узел по умолчанию на свой пользовательский узел.Если это работает, отлично.Если нет, вы знаете, что проблема в вашем пользовательском узле.

На основании предоставленного кода он должен работать, поэтому вам нужно дать нам больше для работы.

0 голосов
/ 02 февраля 2011

Решено! Я добавил несколько точек останова в методе "nodeWereInserted" в источнике DefaultTreeModel и запустил приложение с помощью отладчика. Он показал, что новые узлы были добавлены с нулевым родителем! Дальнейшее исследование показало проблему - node.populateTree (treeNode); строка добавила новый узел, не подключив его к родительскому элементу с отступом. Это новый (рабочий) код. Большое спасибо за помощь.

    void populateTree(BKMNode parent) {
    for (DataNode node : nodes) {
        BKMNode treeNode = new BKMNode(node.name,node.fullName,null);
        // check if this node was already added before
        if (! existingNodes.contains(ip + "." + node.fullName)) {
            existingNodes.add(ip + "." + node.fullName);
            DefaultTreeModel model = (DefaultTreeModel)tree.getModel();
            model.insertNodeInto(treeNode, parent, parent.getChildCount());
            node.bkmNode = treeNode;
            node.populateTree(treeNode);
        } else {
            node.populateTree(node.bkmNode);
        }
    } // for
...