İçindekilerGirişİndex
YukarıİlkÖncekiSonrakiSon
Geriİleri
Yazdır
Raşit Fidan
fidanras79@yahoo.com

JTree Ile Bir Klasördeki Dosyalarin Görüntülenmesi

Bu örneğimizde tree kullanarak bir Klasördeki dosyaları görüntülüyoruz.Örneğimizde üç adet sınıf bulunmaktadır.

FileNode.java

FileNode.javaİndir Göster Gizle Kopar Satır Gizle Satır Göster
  1 package folderexplorer;
  2 import javax.swing.tree.*;
  3 import java.io.File;
  4 import java.util.Hashtable;
  5 public class FileNode
  6     extends DefaultMutableTreeNode {
  7   private File referenceFile;
  8   private boolean explored = false;
  9   public FileNode(File file) {
 10     super(file.getName());
 11     setReferenceFile(file);
 12   }
 13   public String getNodeName() {
 14     return referenceFile.getName();
 15   }
 16   public void setReferenceFile(File f) {
 17     referenceFile = f;
 18   }
 19   public File getReferenceFile() {
 20     return referenceFile;
 21   }
 22   public void setExplored(boolean b) {
 23     explored = b;
 24   }
 25   public boolean getExplored() {
 26     return explored;
 27   }
 28   public void explore() {
 29     if (!explored) {
 30       File[] files = getReferenceFile().listFiles();
 31       for (int i = 0; i < files.length; i++) {
 32         if (files[i].isDirectory() && !files[i].isHidden()) {
 33           add(new FileNode(files[i]));
 34         }
 35       }
 36       setExplored(true);
 37     }
 38   }
 39 }

FileNode class'ı DefaultMutableTreeNode clasını extend eder.Bu class bizim treedeki her düğüm noktamıza tekabül eder.class refeans olduğu dosyanın bir örneğini tutar(File referenceFile).Bunun yanında node'nin açılıp açılmadığını (explore)tutan bir boolean değer vardır(boolean explored = false;).

Bu class; explore adında bir metoda sahiptir.

public void explore() {
    if (!explored) {
      File[] files = getReferenceFile().listFiles();
      for (int i = 0; i < files.length; i++) {
        if (files[i].isDirectory() && !files[i].isHidden()) {
          add(new FileNode(files[i]));
        }
      }
      setExplored(true);
    }
  }

Bu metodla tıklanan Tree düğümü bir klasöre tekabül ediyorsa onu explore(içini araştırma) ediyor.Metot node eğer explored değilse File classının listFiles() metodu ile çocuk düğümleri ele alınır.

File[] files =getReferenceFile().listFiles();

Sonra döngüyle hepsinden bir File Node yaratıp FileNode bünyesine ekliyoruz (FileNode classı DefaultMutableTreeNode classını extend eder ve child node'leri de tutar.).Tabiki eklenecek child bir klasör müdür diye kontrol ettikten sonra.

if (files[i].isDirectory() && !files[i].isHidden())

Eğer istenirse bu kontrol satırı kaldırılırsa klasördeki tüm dosya ve klasörler birlikte görüntülenebilir.

Root.java

Root.javaİndir Göster Gizle Kopar Satır Gizle Satır Göster
  1 package folderexplorer;
  2 import java.awt.*;
  3 import javax.swing.*;
  4 import javax.swing.tree.*;
  5 import javax.swing.event.*;
  6 import java.util.Enumeration;
  7 import java.io.File;
  8 public class Root
  9     extends JPanel {
 10   private ImageIcon opened = null;
 11   private ImageIcon closed = null;
 12   private FileNode rootFileNode;
 13   private JTree tree;
 14   public Root(FileNode fileNode) {
 15     opened = new ImageIcon("folderOpened.png");
 16     closed = new ImageIcon("folderClosed.png");
 17     UIManager.put("Tree.closedIcon", closed);
 18     UIManager.put("Tree.openIcon", opened);
 19     UIManager.put("Tree.leafIcon", closed);
 20     rootFileNode = fileNode;
 21     rootFileNode.explore();
 22     prepareTheSecondChildren(rootFileNode);
 23     tree = new JTree(rootFileNode);
 24     tree.setBounds(new Rectangle(new Dimension(100, 200)));
 25     tree.addTreeSelectionListener(new TreeSelectionListener() {
 26       public void valueChanged(TreeSelectionEvent e) {
 27         TreePath p = e.getPath();
 28         FileNode node = (FileNode) p.getLastPathComponent();
 29       }
 30     });
 31     tree.addTreeWillExpandListener(new TreeWillExpandListener() {
 32       public void treeWillExpand(TreeExpansionEvent e) {
 33         TreePath path = e.getPath();
 34         FileNode node = (FileNode) path.getLastPathComponent();
 35         prepareTheSecondChildren(node);
 36       }
 37       public void treeWillCollapse(TreeExpansionEvent e) {
 38       }
 39     });
 40     add(new JScrollPane(tree));
 41   }
 42   public void prepareTheSecondChildren(FileNode nod) {
 43     Enumeration children = nod.children();
 44     while (children.hasMoreElements()) {
 45       FileNode node = (FileNode) children.nextElement();
 46       if (node.getReferenceFile().isDirectory()) {
 47         node.explore();
 48       }
 49     }
 50   }
 51 }

Bu class ise Jpanel'i extend eder.class'in kurucusunda Tree'de kullanılacak olan resimler de yer alır.

	 opened = new ImageIcon("folderOpened.png");
    closed = new ImageIcon("folderClosed.png");
    UIManager.put("Tree.closedIcon", closed);
    UIManager.put("Tree.openIcon", opened);
    UIManager.put("Tree.leafIcon", closed);

Satırlarıyla UIManager clasını kullanarak Tree'nin openIcon ve closIcon'unu yüklüyoruz.

Treenin bir düğümdeki alt düğümleri yaratması için Tree'ye yapılan actionları yakalamak gerekir.(Bir tree elemanına tıklamak,TreeSelectionEvent,TreeExpansionEvent)

Bunun için Tree'yi TreeSelectionListener() ve TreeWillExpandListener() classlarına eklemek gerekir.

    tree.addTreeSelectionListener(new TreeSelectionListener() {
      public void valueChanged(TreeSelectionEvent e) {
        TreePath p = e.getPath();
        FileNode node = (FileNode) p.getLastPathComponent();
      }
    });
    tree.addTreeWillExpandListener(new TreeWillExpandListener() {
      public void treeWillExpand(TreeExpansionEvent e) {
        TreePath path = e.getPath();
        FileNode node = (FileNode) path.getLastPathComponent();
        prepareTheSecondChildren(node);
      }

      public void treeWillCollapse(TreeExpansionEvent e) {
      }
    });

Root classinin en altında;prepareTheSecondChilds(FileNode nod) metodu görülüyor.Bu metotla tree expand edileceği sıra tree elemanının 2. çocuklarını hazırlıyor(Eğer varsa tabi).Bu neden gereklidir?Bu tıklanan Tree elemanının alt elemanları varsa onları listeler ve hazırlar.

public void prepareTheSecondChildren(FileNode nod) {
    Enumeration children = nod.children();
    while (children.hasMoreElements()) {
      FileNode node = (FileNode) children.nextElement();
      if (node.getReferenceFile().isDirectory()) {
        node.explore();
      }
    }
  }

TreeTest.java

TreeTest.javaİndir Göster Gizle Kopar Satır Gizle Satır Göster
  1 package folderexplorer.test;
  2 import javax.swing.*;
  3 import folderexplorer.*;
  4 import java.io.File;
  5 public class TreeTest
  6     extends JFrame {
  7   public TreeTest(String title) {
  8     super(title);
  9     FileNode fn = new FileNode(new File("D:\\Rasit"));
 10     getContentPane().add(new Root(fn));
 11     pack();
 12     setVisible(true);
 13   }
 14   public static void main(String[] args) {
 15     new TreeTest("Tree");
 16   }
 17 }

Bu class ise panele koyduğumuz Tree'mizi Framede gösteriyoruz.

FileNode fn = new FileNode(new File("D:\\Rasit"));

Root classi kurucusunda bir FileNode alır.Yani kök Nod'unu.Bu satırla kök nodunu veriyoruz ve Treemiz bu klasördeki klasörleri göstermektedir.

Dosya Listesi

İçindekilerGirişİndex
YukarıİlkÖncekiSonrakiSon
Geriİleri
Yazdır