2014-11-18 4 views
1

Я хотел бы создать JTree, отражающий структуру каталогов, но загружаемый succesive.JTree с расширяемыми пустыми родителями

Я имею реж структуру:

c:\root 
-------\dir1 
------------\file1 
------------\file2 
-------\dir2 

Я знаю, как загрузить в структуре узла JTree каталогов первого уровня (dir1, dir2). Но я не хочу искать файлы в каждом каталоге только тогда, когда пользователь будет расширять определенный узел, чтобы сэкономить время и ресурсы.

Из-за выше я хотел бы добавить значок плюса (или эквивалент для конкретного стиля java) на каждый узел, даже если он будет пустым, чтобы предложить пользователю в этой директории быть файлами. Также, когда пользователь будет расширять узел (и будет выполняться поиск), когда dir пуст, я хотел бы удалить любую иконку.
Есть ли способ сделать это?

+5

Параметр 'TreeNode # isLeaf' должен возвращать' false', независимо от того, что может в каталоге. Вам нужно добавить 'TreeExpansionListener' в' JTree' и отслеживать события 'treeExpanded', после чего вам нужно заполнить узел ... – MadProgrammer

+0

Это подходящее решение для меня. – rainbow

ответ

1

Я думаю, что DefaultTreeModel#setAsksAllowsChildren(boolean) - это то, что вы ищете.

Устанавливает, следует ли проверять листовость, задавая getAllowsChildren() или isLeaf() для TreeNodes. Если newValue истинно, getAllowsChildren() отправляется в сообщение, в противном случае isLeaf() отправляется в сообщение.

enter image description here

import java.awt.*; 
import javax.swing.*; 
import javax.swing.tree.*; 

public class AsksAllowsChildrenTest { 
    private JComponent makeUI() { 
    DefaultTreeModel model = makeDefaultTreeModel(); 
    model.setAsksAllowsChildren(true); 

    JPanel p = new JPanel(new GridLayout(1, 2)); 
    p.add(new JScrollPane(new JTree(makeDefaultTreeModel()))); 
    p.add(new JScrollPane(new JTree(model))); 
    return p; 
    } 
    private static DefaultTreeModel makeDefaultTreeModel() { 
    DefaultMutableTreeNode root = new DefaultMutableTreeNode("c:/root"); 
    DefaultMutableTreeNode dir; 

    dir = new DefaultMutableTreeNode("dir1"); 
    root.add(dir); 
    dir.add(new DefaultMutableTreeNode("file1", false)); 
    dir.add(new DefaultMutableTreeNode("file2", false)); 

    dir = new DefaultMutableTreeNode("dir2"); 
    root.add(dir); 

    return new DefaultTreeModel(root); 
    } 
    public static void main(String... args) { 
    EventQueue.invokeLater(new Runnable() { 
     @Override public void run() { 
     createAndShowGUI(); 
     } 
    }); 
    } 
    public static void createAndShowGUI() { 
    JFrame f = new JFrame(); 
    f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
    f.getContentPane().add(new AsksAllowsChildrenTest().makeUI()); 
    f.setSize(320, 240); 
    f.setLocationRelativeTo(null); 
    f.setVisible(true); 
    } 
} 
Смежные вопросы