Vytvoříme nový projekt FileTree, přidáme okno FileWindow typu JFrame
Výsledné okno je vidět obrázku na konci kapitoly
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; } }
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); }
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); } } } }
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 ++; } } } }
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); } } }
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); } } }
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); } } } }
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) { } }
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) { } }
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) { } }
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) { } } }