Создание динамических JTrees (управление видимостью корневых узлов) - PullRequest
4 голосов
/ 16 декабря 2009

У меня есть вопрос о том, как динамически генерировать JTrees. Есть ли способ сделать корневой узел невидимым, не сделав его дочерние элементы невидимыми тоже? Я попытался сделать следующее, но он показывает все узлы как невидимые. Имейте в виду, что я хочу добавлять и удалять дочерние узлы корневого узла в любой момент времени. Я добавил комментарии, чтобы вы могли следить за тем, что я собираюсь сделать. Дайте мне знать, если они делают то, что мне не нужно, так как я новичок в JTrees и не знаю соглашений. Я также хотел бы иметь возможность выбрать несколько детей для слушателя.

    DefaultMutableTreeNode rootNode;
    rootNode = new DefaultMutableTreeNode(); //I want this invisible.

    DefaultTreeModel treeModel = new DefaultTreeModel(rootNode);
    JTree tree = new JTree(treeModel);

    treeModel.addTreeModelListener(this);
    tree.setRootVisible(false); // Sets everything invisible
    tree.setEditable(true); //makes tree dynamic
    tree.setShowsRootHandles(true); //supposedly allows you to see the children of the nodes.

    tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION); 
    //I would like the line above to be multi-select; however, this doesn't seem to be an option.

    DefaultMutableTreeNode table = new DefaultMutableTreeNode( "table1");
    rootNode.add(book);

    DefaultMutableTreeNode value = new DefaultMutableTreeNode( "value");
    table.add(value);

В приведенном выше примере. Ничего не отображается, и когда я удаляю «tree.setRootVisible (false)», все видно, включая узел.

Ответы [ 4 ]

7 голосов
/ 21 сентября 2012

Очень поздний ответ, но у меня только что была такая же проблема. Убедитесь, что развернули свой корневой узел, чтобы его дочерние элементы стали видимыми:

yourTree.expandPath(new TreePath(root.getPath()))
2 голосов
/ 10 января 2012

Я бы сказал, что разница между кодом в вопросе и в TreeDemo заключается в том, что демонстрация дерева создает и добавляет все его узлы до создания реального дерева. Если узлы должны быть добавлены динамически (после создания дерева), это следует сделать с помощью TreeModel. В противном случае никакие события о том, что дерево изменилось, генерироваться не будут. По крайней мере, это то, что учебник говорит о редактировании «содержимого» узла, может быть та же проблема:

Обратите внимание, что хотя DefaultMutableTreeNode имеет методы для изменения содержимое узла, изменения должны пройти через обложку DefaultTreeModel методы. В противном случае события модели дерева не будут генерироваться, и слушатели, такие как дерево, не будут знать об обновлениях.

Чье-то решение

1 голос
/ 16 декабря 2009

Работает нормально для меня. Я основал свои тесты на TreeDemo из учебника по Swing на Как использовать деревья . Сравните ваш код с учебным кодом, чтобы увидеть, в чем разница.

0 голосов
/ 12 января 2018

Очень поздний ответ, я новичок в Java, и у меня была такая же проблема, поэтому она может помочь.

setRootVisible (false) также скрывает все узлы для меня, поэтому я добавил setShowsRootHandles (true), чтобы показать все узлы:

tree.setRootVisible(false);
tree.setShowsRootHandles(true)

Надеюсь, это поможет! https://docs.oracle.com/javase/tutorial/uiswing/components/tree.html#display

...