Полезное для программистов:



Просмотр директорий с помощью JTree

Данный пример взят из книги Swing. Тут нет картинок, но без них все прекрасно работает.


*  Copyright 1999-2002 Matthew Robinson and Pavel Vorobiev.
*  All Rights Reserved.
*  ===================================================
*  This program contains code from the book "Swing"
*  2nd Edition by Matthew Robinson and Pavel Vorobiev
*  http://www.spindoczine.com/sbe
*  ===================================================
*  The above paragraph must be included in full, unmodified
*  and completely intact in the beginning of any source code
*  file that references, copies or uses (in any way, shape
*  or form) code contained in this file.

import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.util.*;

import javax.swing.*;
import javax.swing.tree.*;
import javax.swing.border.*;
import javax.swing.event.*;

public class DirTree
   extends JFrame {

   public static final String APP_NAME = "Directories Tree";

   public static final ImageIcon ICON_COMPUTER =
       new ImageIcon("computer.gif");
   public static final ImageIcon ICON_DISK =
       new ImageIcon("disk.gif");
   public static final ImageIcon ICON_FOLDER =
       new ImageIcon("folder.gif");
   public static final ImageIcon ICON_EXPANDEDFOLDER =
       new ImageIcon("expandedfolder.gif");

   protected JTree  m_tree;
   protected DefaultTreeModel m_model;
   protected JTextField m_display;

   public DirTree() {
       setSize(400, 300);

       DefaultMutableTreeNode top = new DefaultMutableTreeNode(
           new IconData(ICON_COMPUTER, null, "Computer"));

       DefaultMutableTreeNode node;
       File[] roots = File.listRoots();
       for (int k=0; k<roots.length; k++) {
           node = new DefaultMutableTreeNode(new IconData(ICON_DISK,
               null, new FileNode(roots[k])));
           node.add( new DefaultMutableTreeNode(new Boolean(true)));

       m_model = new DefaultTreeModel(top);
       m_tree = new JTree(m_model);

       m_tree.putClientProperty("JTree.lineStyle", "Angled");

       IconCellRenderer renderer = new




       JScrollPane s = new JScrollPane();
       getContentPane().add(s, BorderLayout.CENTER);

       m_display = new JTextField();
       m_display.setBorder(new SoftBevelBorder(BevelBorder.LOWERED));
       getContentPane().add(m_display, BorderLayout.NORTH);

   DefaultMutableTreeNode getTreeNode(TreePath path) {
       return (DefaultMutableTreeNode)(path.getLastPathComponent());

   FileNode getFileNode(DefaultMutableTreeNode node) {
       if (node == null)
           return null;
       Object obj = node.getUserObject();
       if (obj instanceof IconData)
           obj = ((IconData)obj).getObject();
       if (obj instanceof FileNode)
           return (FileNode)obj;
           return null;

   // Make sure expansion is threaded and updating the tree model
   // only occurs within the event dispatching thread.
   class DirExpansionListener implements TreeExpansionListener {

       public void treeExpanded(TreeExpansionEvent event) {

           final DefaultMutableTreeNode node = getTreeNode(
           final FileNode fnode = getFileNode(node);

           Thread runner = new Thread() {
               public void run() {
                   if (fnode != null && fnode.expand(node)) {
                       Runnable runnable = new Runnable() {
                           public void run() {

       public void treeCollapsed(TreeExpansionEvent event) {}

   class DirSelectionListener
       implements TreeSelectionListener {

       public void valueChanged(TreeSelectionEvent event) {
           DefaultMutableTreeNode node = getTreeNode(
           FileNode fnode = getFileNode(node);
           if (fnode != null)

   public static void main(String argv[]) {
       DirTree frame = new DirTree();

class IconCellRenderer
   extends    DefaultTreeCellRenderer {

   public IconCellRenderer() {

   public Component getTreeCellRendererComponent(JTree tree,
       Object value, boolean sel, boolean expanded, boolean leaf,
       int row, boolean hasFocus) {

       // Invoke default implementation
       Component result = super.getTreeCellRendererComponent(tree,
           value, sel, expanded, leaf, row, hasFocus);

       DefaultMutableTreeNode node =
       Object obj = node.getUserObject();

       if (obj instanceof Boolean)
           setText("Retrieving data...");

       if (obj instanceof IconData) {
           IconData idata = (IconData)obj;
           if (expanded)

       return result;

class IconData {
   protected Icon   m_icon;
   protected Icon   m_expandedIcon;
   protected Object m_data;

   public IconData(Icon icon, Object data) {
       m_icon = icon;
       m_expandedIcon = null;
       m_data = data;

   public IconData(Icon icon, Icon expandedIcon, Object data) {
       m_icon = icon;
       m_expandedIcon = expandedIcon;
       m_data = data;

   public Icon getIcon() {
       return m_icon;

   public Icon getExpandedIcon() {
       return m_expandedIcon!=null ? m_expandedIcon : m_icon;

   public Object getObject() {
       return m_data;

   public String toString() {
       return m_data.toString();

class FileNode {
   protected File m_file;

   public FileNode(File file) {
       m_file = file;

   public File getFile() {
       return m_file;

   public String toString() {
       return m_file.getName().length() > 0 ? m_file.getName() :

   // Alternatively we copud sub-class TreeNode
   public boolean expand(DefaultMutableTreeNode parent) {
       DefaultMutableTreeNode flag =
       if (flag==null)   // No flag
           return false;
       Object obj = flag.getUserObject();
       if (!(obj instanceof Boolean))
           return false;      // Already expanded

       parent.removeAllChildren();  // Remove Flag

       File[] files = listFiles();
       if (files == null)
           return true;

       Vector v = new Vector();

       for (int k=0; k<files.length; k++) {
           File f = files[k];
           if (!(f.isDirectory()))

           FileNode newNode = new FileNode(f);

           boolean isAdded = false;
           for (int i=0; i<v.size(); i++) {
               FileNode nd = (FileNode)v.elementAt(i);
               if (newNode.compareTo(nd) < 0) {
                   v.insertElementAt(newNode, i);
                   isAdded = true;
           if (!isAdded)

       for (int i=0; i<v.size(); i++) {
           FileNode nd = (FileNode)v.elementAt(i);
           IconData idata = new IconData(DirTree.ICON_FOLDER,
               DirTree.ICON_EXPANDEDFOLDER, nd);
           DefaultMutableTreeNode node = new

           if (nd.hasSubDirs())
               node.add(new DefaultMutableTreeNode(
                   new Boolean(true) ));

       return true;

   public boolean hasSubDirs() {
       File[] files = listFiles();
       if (files == null)
           return false;
       for (int k=0; k<files.length; k++) {
           if (files[k].isDirectory())
               return true;
       return false;

   public int compareTo(FileNode toCompare) {
       return  m_file.getName().compareToIgnoreCase(
           toCompare.m_file.getName() );

   protected File[] listFiles() {
       if (!m_file.isDirectory())
           return null;
       try {
           return m_file.listFiles();
       catch (Exception ex) {
               "Error reading directory "+m_file.getAbsolutePath(),
               DirTree.APP_NAME, JOptionPane.WARNING_MESSAGE);
           return null;
Автор: AntonSaburov

Просмотров: 3884



Новые статьи:

  1. Как сделать цикличным проигрывание MIDI-файла?
  2. Создание AVI файла из рисунков
  3. Как устройство "отключить в данной конфигурации"?
  4. Kто в данный момент присоединен через Сеть?
  5. Как узнать количество доступной памяти?
  6. Как реализовать в RichEdit разноцветный текст?
  7. Как скрыть свое приложение от ProcessViewer
  8. Как программно нажать/скрыть/показ кнопку "Start"?
  9. Модуль работы с ресурсами в PE файлах
10. Функции вызова диалоговых окон выбора
11. Проверка граматики средствами Word'а из Delphi.
12. Модуль для упрощенного вызова сообщений
13. Функции для записи и чтение своих данных в, ЕХЕ- файле
14. Рекурсивный просмотр директорий
15. Network Traffic Monitor
16. Разные модули
17. Универсальная функция для обращения к любым экспортируем функциям DLL
18. Библиотека от VladS
19. Протектор для UPX'а
20. Еще об ICQ, сообщения по контакт листу?
21. Использование открытых интерфейсов
22. Теория и практика использования RTTI
23. Работа с TApplication
24. Примеры использования Drag and Drop для различных визуальных компонентов
25. Что такое порт? Правила для работы с портами
26. Симфония на клавиатуре
27. Загрузка DLL
28. Исправление автоинкремента
29. Взаимодействие с чужими окнами
30. Проверить дубляжи в столбце



На главную