Table of Contents

Strom zobrazující adresáře se soubory

Vytvoříme nový projekt FileTree, přidáme okno FileWindow typu JFrame

Výsledné okno je vidět obrázku na konci kapitoly

Třída MyData

Vytvoříme třídu MyData (na záložce Project, pravou myší New, Java Class) MyData bude obsahovat informace o jednotlivých adresářích

package filetree;
 
class MyData 
{
    public String path;
    public String name;
    public boolean ready;
    public String toString () { return name; }
}

Funkce showDirectories

    private void showDirectories ()
    {
        DefaultMutableTreeNode root = new DefaultMutableTreeNode ("Files");
        treeModel = new DefaultTreeModel (root);
        tree.setModel (treeModel);
 
        File [] list = File.listRoots ();
        int cnt = 0;
        for (File f : list)
        {
            MyData data = new MyData ();
            data.name = f.getAbsolutePath ();
            data.path = f.getAbsolutePath();
 
            DefaultMutableTreeNode node = new DefaultMutableTreeNode (data);
 
            treeModel.insertNodeInto (node, root, cnt);
            cnt ++;
        }
        tree.expandRow (0);
    }

Reakce na rozvinutí větve stromu

Adresářů je na disku příliš mnoho, budeme je ve stromu zobrazovat postupně, jak uživatel bude rozvíjet jednotlivé větve

Při návrhu okna klikneme pravou myší na strom a vybereme Events, TreeExpansion, treeExpanded

Podobně zobrazíme i podadresáře podadresářů.
Pokud chceme u podadresářů, které mají opět podadresáře, vidět ikonu naznačující vnořené adresáře,
musíme ve stromu skladovat o jedno patro adresářů více než právě zobrazujeme.

    private void treeTreeExpanded(javax.swing.event.TreeExpansionEvent evt)                                  
    {                                      
        DefaultMutableTreeNode node = (DefaultMutableTreeNode) evt.getPath ().getLastPathComponent ();
        if (node != null)
        {
            Object obj = node.getUserObject ();
            if (obj instanceof MyData)
            {
                MyData data = (MyData) node.getUserObject ();
                // System.out.println ("EXPANDED " + data.path);
 
                if (! data.ready)
                {
                    addDirectory (node, data);
                }
            }
 
            int cnt = node.getChildCount ();
            for (int i = 0 ; i < cnt; i ++)
            {
                DefaultMutableTreeNode n = (DefaultMutableTreeNode) node.getChildAt (i);
                MyData d = (MyData) n.getUserObject ();
                if (! d.ready)
                {
                    addDirectory (n, d);
                }
            }
        }
    }

Zobrazení podadresářů funkcí addDirectory

    private void addDirectory (DefaultMutableTreeNode topNode, MyData topData)
    {
        topData.ready = true;
 
        File dir = new File (topData.path);
        File [] list = dir.listFiles ();
 
        if (list != null)
        {
            Arrays.sort (list);
            int cnt = 0;
            for (File f : list)
            {
                if (f.isDirectory ())
                {
                    MyData data = new MyData ();
                    data.name = f.getName ();
                    data.path = f.getAbsolutePath();
 
                    DefaultMutableTreeNode node = new DefaultMutableTreeNode (data);
 
                    treeModel.insertNodeInto (node, topNode, cnt);
                    cnt ++;
                }
            }
        }
    }

Reakce na "kliknutí" ve stromu

Pokud “klikneme” na adresář, chceme v tabulce zobrazit seznam souborů

Během návrhu okna klikneme pravou myší na strom a vybereme Events, TreeSelection, valueChanged

Do proměnné node uložíme odkaz na uzel stromu.
Z uživatelských dat zjistíme cestu k odpovídajícímu adresáři.
Tabulku souborů zobrazíme funkcí addFiles

    private void treeValueChanged(javax.swing.event.TreeSelectionEvent evt) {                                  
        DefaultMutableTreeNode node = (DefaultMutableTreeNode) tree.getLastSelectedPathComponent();
        if (node != null)
        {
            Object obj = node.getUserObject ();
            if (obj instanceof MyData)
            {
                MyData data = (MyData) node.getUserObject ();
                // System.out.println ("SELECT " + data.path);
                addFiles (data.path);
            }
        }
    }

Funkce addFiles zobrazující tabulku souborů

Seznam jmen souborů právě zobrazených v tabulce budeme skladovat v proměnné fileInfo deklarované na úrovni třídy představující hlavní okno.
Proměnná bude typu Vector (šablonový typ obsahující dynamicky se zvětšující pole) obsahující položky typu String.

    private Vector <String> fileInfo = new Vector <String> ();

Funkce addFiles

   Object [] line = { name, formatNumber (size), fmt.format (date) };
   tableModel.addRow (line);
    private void addFiles (String path)
    {
        tableModel.setRowCount (0);
        fileInfo.clear ();
 
        File dir = new File (path);
        File [] list = dir.listFiles ();
 
        SimpleDateFormat fmt = new SimpleDateFormat ("yyyy-MM-dd HH:mm:ss");
 
        if (list != null)
            for (File f : list)
            {
                if (f.isFile ())
                {
                    fileInfo.add (f.getAbsolutePath());
 
                    String name = f.getName ();
                    long size = f.length ();
                    Date date = new Date (f.lastModified());
 
                    Object [] line = { name, formatNumber (size), fmt.format (date) };
                    tableModel.addRow (line);
                }
           }
    }

"Dvojité kliknutí" na soubor v tabulce

Při návrhu okna klikneme pravou myší na tabulku a vybereme Events, Mouse, mouseClick

    private void tableMouseClicked(java.awt.event.MouseEvent evt)                                   
    {                                       
        if (evt.getClickCount () == 2)
        {
            int line = table.getSelectedRow ();
            if (line >= 0)
            {
                String path = fileInfo.elementAt (line);
                System.out.println ("DOUBLE CLICK " + path);
 
                if (path.endsWith (".java"))
                {
                    showTextFile (path);
                }
                if (path.endsWith (".png") || path.endsWith (".bmp") || path.endsWith (".gif") || path.endsWith (".jpeg"))
                {
                    showImage (path);
                }
                if (path.endsWith (".csv"))
                {
                    showTable (path);
                }
            }
        }
    }

Zobrazení textového souboru

       tabs.addTab (fileName (path), edit);
       tabs.setSelectedComponent (edit);

Pokud během čtení souboru dojde k výjimce, nebudeme dělat nic try { … } catch (FileNotFoundException ex) { }

    private void showTextFile (String path)
    {
        try 
        {
            StringBuilder t = new StringBuilder ();
            FileReader r = new FileReader (path);
            BufferedReader b = new BufferedReader (r);
            while (b.ready ())
            {
                t.append (b.readLine() + "\n");
            }
 
            JTextArea edit = new JTextArea ();
            edit.setText (t.toString());
 
            tabs.addTab (fileName (path), edit);
            tabs.setSelectedComponent (edit);
        } 
        catch (FileNotFoundException ex) { } 
        catch (IOException ex) { }
    }

Obrázek

    private void showImage (String path)
    {
        try
        {
            BufferedImage img = ImageIO.read (new File (path));
            Icon icon = new ImageIcon (img);
 
            JLabel label = new JLabel ();
            label.setIcon (icon);
 
            tabs.addTab (fileName (path), label);
            tabs.setSelectedComponent (label);
        } 
        catch (IOException ex) { }
    }

Tabulka hodnot

Soubory s příponou ”.csv” zobrazíme pomocí JTable

    Vector <String []> lines = new Vector <String []> ();

Dříve než vytvoříme model tabulky, potřebujeme znát počet sloupců

    String s = b.readLine ();
    String [] data = s.split (",");
    int cnt = data.length;
    if (cnt > columns) columns = cnt;
    lines.add (data);
    JTable t = new JTable ();
    t.setShowGrid (true);
    DefaultTableModel m = (DefaultTableModel) t.getModel ();
 
    m.setColumnCount (columns);
    for (String [ ] line : lines)
         m.addRow (line);
    private void showTable (String path)
    {
        try
        {
            FileReader r = new FileReader (path);
            BufferedReader b = new BufferedReader (r);
 
            Vector <String []> lines = new Vector <String []> ();
            int columns = 0;
            while (b.ready ())
            {
                String s = b.readLine ();
                String [] data = s.split (",");
                int cnt = data.length;
                if (cnt > columns) columns = cnt;
                lines.add (data);
            }
 
            JTable t = new JTable ();
            t.setShowGrid (true);
            DefaultTableModel m = (DefaultTableModel) t.getModel ();
 
            m.setColumnCount (columns);
            for (String [ ] line : lines)
                m.addRow (line);
 
            tabs.addTab (fileName (path), t);
            tabs.setSelectedComponent (t);
        } 
        catch (IOException ex) { }
    }

Celý program

package filetree;
 
import java.awt.image.*;
import java.io.*;
import java.text.*;
import java.time.format.*;
import java.util.*;
import javax.imageio.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.table.*;
import javax.swing.tree.*;
 
public class FileWindow extends javax.swing.JFrame {
 
    private DefaultTreeModel treeModel;
    private DefaultTableModel tableModel;
    private Vector <String> fileInfo = new Vector <String> ();
 
    public FileWindow() {
        initComponents();
 
        tableModel = (DefaultTableModel) table.getModel ();
 
        showDirectories ();
    }
 
    private void showDirectories ()
    {
        DefaultMutableTreeNode root = new DefaultMutableTreeNode ("Files");
        treeModel = new DefaultTreeModel (root);
        tree.setModel (treeModel);
 
        File [] list = File.listRoots ();
        int cnt = 0;
        for (File f : list)
        {
            if (f.isDirectory ())
            {
                MyData data = new MyData ();
                data.name = f.getAbsolutePath ();
                data.path = f.getAbsolutePath();
 
                DefaultMutableTreeNode node = new DefaultMutableTreeNode (data);
 
                treeModel.insertNodeInto (node, root, cnt);
                cnt ++;
            }
        }
 
        tree.expandRow (0);
    }
 
    private void treeValueChanged(javax.swing.event.TreeSelectionEvent evt) {                                  
        DefaultMutableTreeNode node = (DefaultMutableTreeNode) tree.getLastSelectedPathComponent();
        if (node != null)
        {
            Object obj = node.getUserObject ();
            if (obj instanceof MyData)
            {
                MyData data = (MyData) node.getUserObject ();
                // System.out.println ("SELECT " + data.path);
                addFiles (data.path);
            }
        }
    }                                 
 
    private void treeTreeExpanded(javax.swing.event.TreeExpansionEvent evt)                                  
    {                                      
        DefaultMutableTreeNode node = (DefaultMutableTreeNode) evt.getPath ().getLastPathComponent ();
        if (node != null)
        {
            Object obj = node.getUserObject ();
            if (obj instanceof MyData)
            {
                MyData data = (MyData) node.getUserObject ();
                // System.out.println ("EXPANDED " + data.path);
 
                if (! data.ready)
                {
                    addDirectory (node, data);
                }
            }
 
            int cnt = node.getChildCount ();
            for (int i = 0 ; i < cnt; i ++)
            {
                DefaultMutableTreeNode n = (DefaultMutableTreeNode) node.getChildAt (i);
                MyData d = (MyData) n.getUserObject ();
                if (! d.ready)
                {
                    // System.out.println ("ADD " + d.path);
                    addDirectory (n, d);
                }
            }
        }
    }                                 
 
    private void addDirectory (DefaultMutableTreeNode topNode, MyData topData)
    {
        topData.ready = true;
 
        File dir = new File (topData.path);
        File [] list = dir.listFiles ();
 
        if (list != null)
        {
            Arrays.sort (list);
            int cnt = 0;
            for (File f : list)
            {
                if (f.isDirectory ())
                {
                    MyData data = new MyData ();
                    data.name = f.getName ();
                    data.path = f.getAbsolutePath();
 
                    DefaultMutableTreeNode node = new DefaultMutableTreeNode (data);
 
                    treeModel.insertNodeInto(node, topNode, cnt);
                    cnt ++;
                }
            }
        }
    }
 
    private String formatNumber (long number)
    {
        String s = "" + number;
        int len = s.length ();
        String result = "";
        int cnt = 0;
        for (int i = len-1; i >= 0; i--)
        {
            result = s.charAt (i) + result;
            cnt ++;
            if (cnt % 4 == 3)
            {
                result = ' ' + result;
                cnt ++;
            }
        }
 
        while (cnt <= 12)
        {
            result = ' ' + result;
            cnt ++;
        }
 
        return result;
    }
 
    private void addFiles (String path)
    {
        tableModel.setRowCount (0);
        fileInfo.clear ();
 
        File dir = new File (path);
        File [] list = dir.listFiles ();
 
        SimpleDateFormat fmt = new SimpleDateFormat ("yyyy-MM-dd HH:mm:ss");
 
        if (list != null)
            for (File f : list)
            {
                if (f.isFile ())
                {
                    fileInfo.add (f.getAbsolutePath());
 
                    String name = f.getName ();
                    long size = f.length ();
                    Date date = new Date (f.lastModified());
 
                    Object [] line = { name, formatNumber (size), fmt.format (date) };
                    tableModel.addRow (line);
                }
           }
    }
 
    private void tableMouseClicked(java.awt.event.MouseEvent evt)                                   
    {                                       
        if (evt.getClickCount () == 2)
        {
            int line = table.getSelectedRow ();
            if (line >= 0)
            {
                String path = fileInfo.elementAt (line);
                System.out.println ("DOUBLE CLICK " + path);
 
                if (path.endsWith (".java"))
                {
                    showTextFile (path);
                }
                if (path.endsWith (".png") || path.endsWith (".bmp") || path.endsWith (".gif") || path.endsWith (".jpeg"))
                {
                    showImage (path);
                }
                if (path.endsWith (".csv"))
                {
                    showTable (path);
                }
            }
        }
    }                                  
 
    private String fileName (String path)
    {
        File f = new File (path);
        return f.getName ();
    }
 
    private void showTextFile (String path)
    {
        try 
        {
            StringBuilder t = new StringBuilder ();
            FileReader r = new FileReader (path);
            BufferedReader b = new BufferedReader (r);
            while (b.ready ())
            {
                t.append (b.readLine() + "\n");
            }
 
            JTextArea edit = new JTextArea ();
            edit.setText (t.toString());
            tabs.addTab (fileName (path), edit);
            tabs.setSelectedComponent (edit);
        } 
        catch (FileNotFoundException ex) { } 
        catch (IOException ex) { }
    }
 
    private void showImage (String path)
    {
        try
        {
            BufferedImage img = ImageIO.read (new File (path));
            Icon icon = new ImageIcon (img);
 
            JLabel label = new JLabel ();
            label.setIcon (icon);
            tabs.addTab (fileName (path), label);
            tabs.setSelectedComponent (label);
        } 
        catch (IOException ex) { }
    }
 
    private void showTable (String path)
    {
        try
        {
            FileReader r = new FileReader (path);
            BufferedReader b = new BufferedReader (r);
 
            Vector <String []> lines = new Vector <String []> ();
            int columns = 0;
            while (b.ready ())
            {
                String s = b.readLine ();
                String [] data = s.split (",");
                int cnt = data.length;
                if (cnt > columns) columns = cnt;
                lines.add (data);
            }
 
            JTable t = new JTable ();
            t.setShowGrid (true);
            DefaultTableModel m = (DefaultTableModel) t.getModel ();
 
            m.setColumnCount (columns);
            for (String [ ] line : lines)
                m.addRow (line);
 
            tabs.addTab (fileName (path), t);
            tabs.setSelectedComponent (t);
        } 
        catch (IOException ex) { }
    }
}

gitlab zip