DirectoryChooser

Aus Byte-Welt Wiki
Zur Navigation springenZur Suche springen

FileTree

<code=java> package tests.swing;

import java.io.File; import java.io.FileFilter; import java.util.Arrays; import java.util.Collections; import java.util.Comparator; import java.util.List;

import javax.swing.JTree; import javax.swing.event.TreeExpansionEvent; import javax.swing.event.TreeWillExpandListener; import javax.swing.filechooser.FileSystemView; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.DefaultTreeModel; import javax.swing.tree.TreePath; import javax.swing.tree.TreeSelectionModel;

public class FileTree extends JTree implements TreeWillExpandListener {

   private static class FileComparator implements Comparator<File> {
       public int compare(File f1, File f2) {
           if(f1.isDirectory() ^ f2.isDirectory()) {
               return (f1.isDirectory() ? -1 : 1);
           }
           return f1.getName().compareToIgnoreCase(f2.getName());
       }
   } 
   private static class DirectoryFilter implements FileFilter {
       public boolean accept(File f) {
           return f.isDirectory();
       }
   } 
   private static class AcceptAllFilter implements FileFilter {
       public boolean accept(File f) {
           return true;
       }
   } 
   private static final Comparator<File> FILE_COMPARATOR = new FileComparator(); 
   /** Ein FileFilter, der nur Verzeichnisse akzeptiert */
   public static final FileFilter DIRECTORY_FILTER = new DirectoryFilter(); 
   /** Ein FileFilter der alle Typen von Dateien und Verzeichnisse akzeptiert */
   public static final FileFilter ACCEPT_ALL_FILTER = new AcceptAllFilter(); 
   /** Der aktuelle FileFilter */
   protected FileFilter filter = null; 
   public FileTree() {
       // Home Verzeichnis feststellen
       File homeDir = FileSystemView.getFileSystemView().getHomeDirectory();
       // Wurzelelement erstellen
       DefaultMutableTreeNode root = new DefaultMutableTreeNode(homeDir);
       // Model erstellen mit root als Wurzelelement
       DefaultTreeModel model = new DefaultTreeModel(root);
       setModel(model);
       setShowsRootHandles(true);
       // TreeCellRenderer setzen.
       setCellRenderer(new FileTreeRenderer());
       // Wurzel aufklappen
       expandPath(root);
       // Listener hinzufügen
       addTreeWillExpandListener(this);
       // und so ...
       getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
   } 
   /**
    * Erweitert einen Pfad im Tree.
    * 
    * @param d Den Parent Knoten
    */
   private void expandPath(final DefaultMutableTreeNode d) {
       d.removeAllChildren();
       File[] tempf = ((File) d.getUserObject()).listFiles(); 
       List<File> files = Arrays.asList(tempf);
       Collections.sort(files, FILE_COMPARATOR); 
       DefaultMutableTreeNode temp = null;
       for(File file: files) {
           if(filter != null && !filter.accept(file))
               continue;
           temp = new DefaultMutableTreeNode(file);
           if(file.isDirectory())
               temp.add(new DefaultMutableTreeNode(null));
           d.add(temp);
       }
       ((DefaultTreeModel) getModel()).reload(d);
   } 
   /**
    * Setzt den FileFilter und setzt den Tree zurück.
    * 
    * @param f Der neue FileFilter
    */
   public void setFileFilter(FileFilter f) {
       filter = f;
       expandPath((DefaultMutableTreeNode) getModel().getRoot());
   } 
   /**
    * Liefert den aktuell gesetzten FileFilter zurück
    * @return Den FileFilter
    */
   public FileFilter getFileFilter() {
       return filter;
   } 
   public File getSelectedFile() {
       TreePath selectionPath = getSelectionPath();
       if(selectionPath == null)
           return null;
       DefaultMutableTreeNode node = (DefaultMutableTreeNode) selectionPath.getLastPathComponent();
       return (File) node.getUserObject();
   } 
   public void treeWillCollapse(TreeExpansionEvent e) {
       ((DefaultMutableTreeNode) (e.getPath().getLastPathComponent())).removeAllChildren();
       ((DefaultMutableTreeNode) (e.getPath().getLastPathComponent())).add(new DefaultMutableTreeNode(null));
   } 
   public void treeWillExpand(TreeExpansionEvent e) {
       expandPath((DefaultMutableTreeNode) (e.getPath().getLastPathComponent()));
   }

} </code=java>


FileTreeRenderer

<code=java> package tests.swing;

import java.awt.Component; import java.io.File;

import javax.swing.JTree; import javax.swing.filechooser.FileSystemView; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.DefaultTreeCellRenderer;

class FileTreeRenderer extends DefaultTreeCellRenderer {

   private FileSystemView fsv = FileSystemView.getFileSystemView(); 
   public Component getTreeCellRendererComponent(JTree tree, Object value, boolean sel, boolean expanded,
           boolean leaf, int row, boolean hasFocus) {
       super.getTreeCellRendererComponent(tree, value, sel, expanded, leaf, row, hasFocus);
       Object user = ((DefaultMutableTreeNode) value).getUserObject();
       if(user instanceof File) {
           File f = (File) user;
           String name = f.getName();
           setIcon(fsv.getSystemIcon(f));
           setText(fsv.getSystemDisplayName(f));
       }
       return this;
   }

} </code=java>


FileTreeTest

<code=java> package tests.swing;

import java.awt.BorderLayout; import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.io.File;

import javax.swing.AbstractAction; import javax.swing.BorderFactory; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.UIManager; import javax.swing.border.Border;

public class FileTreeTest {

   /**
    * @param args
    */
   public static void main(String[] args) throws Exception {
       UIManager.setLookAndFeel( UIManager.getSystemLookAndFeelClassName() ); 
       final JFrame f = new JFrame("Datei auswählen");
       f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);        
       final FileTree chooser = new FileTree();
       chooser.setFileFilter(FileTree.DIRECTORY_FILTER);
       JScrollPane scrp = new JScrollPane(chooser);
       Border empty = BorderFactory.createEmptyBorder(5, 5, 2, 5);
       scrp.setBorder(BorderFactory.createCompoundBorder(empty, scrp.getBorder())); 
       JPanel bottom = new JPanel(new FlowLayout(FlowLayout.RIGHT));
       bottom.add(new JButton(new AbstractAction("OK") { 
           public void actionPerformed(ActionEvent e) {
               File file = chooser.getSelectedFile();
               String s = "'" + file+ "'";
               if(file == null)
                   s = "nix";
               JOptionPane.showMessageDialog(f, "Es wurde "+s+" selektiert.");
               f.dispose();
           }
       }));        
       f.add(scrp);
       f.add(bottom, BorderLayout.SOUTH);        
       f.setSize(300, 400);
       f.setLocationRelativeTo(null);
       f.setVisible(true);
   }

} </code=Java>

Ähnliche Themen


Fragen

Das Thema wurde nicht ausreichend behandelt? Du hast Fragen dazu und brauchst weitere Informationen? Lass Dir von uns helfen!

Wir helfen dir gerne!


Dir hat dieser Artikel gefallen? Oder Du hast Fehler entdeckt und möchtest zur Berichtigung beitragen? Prima! Schreibe einen Kommentar!

Du musst angemeldet sein, um einen Kommentar abzugeben. --Benutzer:Roar (© Janni Kovacs - 03.12.2005, 21:23)