2013-03-01 2 views
3

В моем проекте я пытаюсь добавить файловый проводник, чтобы пользователь мог выбирать файлы из заданного каталога. Я хочу ограничить это представление корневой папкой проекта (которая определяется пользователем). Это очень похоже на Eclipses Package Explorer, поскольку «рабочая область» определяется пользователем.Как отображать имя файла JTree?

В настоящее время файлы не отображают полный путь (из C :), который я хочу, но все папки отображают полный путь (который я не хочу, просто хочу имя папки).

Так как же JTree отображает эти имена?

Я видел вокруг, что JTree использует метод File.tostring(), но когда я реализовал свой собственный файл и перезаписал метод toString, ничего не изменилось.

Вот мой код:

import java.awt.BorderLayout; 
import java.io.File; 

import javax.swing.JFileChooser; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTree; 
import javax.swing.event.TreeModelListener; 
import javax.swing.tree.TreeModel; 
import javax.swing.tree.TreePath; 
import java.awt.Color; 
import java.awt.Container; 
import java.awt.Dimension; 
import java.util.Collections; 
import java.util.Vector; 

import javax.swing.BoxLayout; 
import javax.swing.JFrame; 
import javax.swing.event.TreeSelectionEvent; 
import javax.swing.event.TreeSelectionListener; 
import javax.swing.tree.DefaultMutableTreeNode; 

public class pnl_fileView extends JPanel { 
    /** 
    * Display a file system in a JTree view 
    * 
    * @version $Id: FileTree.java,v 1.9 2004/02/23 03:39:22 ian Exp $ 
    * @author Ian Darwin 
    */ 
    /** Construct a FileTree */ 

    // public pnl_fileView(){ 
    private myFile projectFile; 
    public pnl_fileView(myFile dir) { 
     //Create file explorer 
     //Need to add setup for root folder change. 
     //Config.getProject(); //This gets the current file from the config file. 
     //Begin choose File 
     if(projectFile == null){ 
      JFileChooser chooser; 
      String choosertitle = "Please Choose a Root Folder"; 
      chooser = new JFileChooser(); 
      chooser.setCurrentDirectory(new java.io.File(".")); 
      chooser.setDialogTitle(choosertitle); 
      chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); 
      // 
      // disable the "All files" option. 
      // 
      chooser.setAcceptAllFileFilterUsed(false); 
      //  
      if (chooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) { 
       System.out.println("getCurrentDirectory(): " + chooser.getCurrentDirectory()); 
       System.out.println("getSelectedFile() : " + chooser.getSelectedFile()); 
       projectFile = new myFile(chooser.getSelectedFile().getAbsolutePath()); 
       //projectFile = chooser.getSelectedFile(); 
      } 
      else { 
       System.out.println("No Selection "); 
      } 
     } 
     else { 
      // Figure out where in the filesystem to start displaying 
     } 

     //End choose file 
     setLayout(new BorderLayout()); 

     // Make a tree list with all the nodes, and make it a JTree 
     JTree tree = new JTree(addNodes(null, projectFile)); 

     // Add a listener 
     tree.addTreeSelectionListener(new TreeSelectionListener() { 
      public void valueChanged(TreeSelectionEvent e) { 
       DefaultMutableTreeNode node = (DefaultMutableTreeNode) e 
         .getPath().getLastPathComponent(); 
       System.out.println("You selected " + node); 
      } 
     }); 

     // Lastly, put the JTree into a JScrollPane. 
     JScrollPane scrollpane = new JScrollPane(); 
     scrollpane.getViewport().add(tree); 
     add(BorderLayout.CENTER, scrollpane); 
    } 

    /** Add nodes from under "dir" into curTop. Highly recursive. */ 
    DefaultMutableTreeNode addNodes(DefaultMutableTreeNode curTop, myFile dir) { 
     String curPath = dir.getPath(); 
     System.out.println(curPath); 
     DefaultMutableTreeNode curDir = new DefaultMutableTreeNode(curPath); 
     if (curTop != null) { // should only be null at root 
      curTop.add(curDir); 
     } 
     Vector<String> ol = new Vector<String>(); 
     String[] tmp = dir.list(); 
     for (int i = 0; i < tmp.length; i++) 
      ol.addElement(tmp[i]); 
     Collections.sort(ol, String.CASE_INSENSITIVE_ORDER); 
     myFile f; 
     Vector<String> files = new Vector<String>(); 
     // Make two passes, one for Dirs and one for Files. This is #1. 
     for (int i = 0; i < ol.size(); i++) { 
      String thisObject = (String) ol.elementAt(i); 
      String newPath; 
      if (curPath.equals(".")) 
       newPath = thisObject; 
      else 
       newPath = curPath + myFile.separator + thisObject; 
      System.out.println("this is the path: " + newPath); 
      if ((f = new myFile(newPath)).isDirectory()) 
       addNodes(curDir, f); 
      else 
       files.addElement(thisObject); 
     } 
     // Pass two: for files. 
     for (int fnum = 0; fnum < files.size(); fnum++) 
      curDir.add(new DefaultMutableTreeNode(files.elementAt(fnum))); 
     return curDir; 
    } 

    public Dimension getMinimumSize() { 
     return new Dimension(200, 400); 
    } 

    public Dimension getPreferredSize() { 
     return new Dimension(200, 400); 
    } 

    /** Main: make a Frame, add a FileTree */ 
    public static void main(String[] av) { 

     JFrame frame = new JFrame("FileTree"); 
     frame.setForeground(Color.black); 
     frame.setBackground(Color.lightGray); 
     Container cp = frame.getContentPane(); 

     if (av.length == 0) { 
      cp.add(new pnl_fileView(new myFile("."))); 
     } else { 
      cp.setLayout(new BoxLayout(cp, BoxLayout.X_AXIS)); 
      for (int i = 0; i < av.length; i++) 
       cp.add(new pnl_fileView(new myFile(av[i]))); 
     } 

     frame.pack(); 
     frame.setVisible(true); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 
} 
class myFile extends File{ 
    public myFile(String pathname) { 
     super(pathname); 

    } 
    public String toString() { 
     return "Hello World!"; 
    } 
    public String getAbsolutePath(){ 
     return "hi"; 
    } 
} 
+1

Зависит. 'JTree' будет использовать' Object # toString' для каждого узла, чтобы определить, что он должен отображать. Вы должны создать свой собственный TreeCellRenderer, который вы можете использовать для определения наилучшего способа отображения объекта. Было бы проще помочь вам, если бы вы могли предоставить рабочий пример. – MadProgrammer

+0

Добавил мой код, я взглянул на treeCellRenderer, но у меня возникли проблемы с его работой. База кода была взята из другого источника, поэтому есть еще некоторые фрагменты, которые я не удалял. –

+0

Пожалуйста, изучите соглашения об именах java и придерживайтесь их. – kleopatra

ответ

4

Лично я бы не попытаться установить значение узлов отображения с помощью какого-либо другого объекта, я хотел бы оставить, что до TreeCellRenderer решить. Основной причиной этого является то, что данные, которые содержатся узлом, могут понадобиться какой-либо другой части программы.

enter image description here

import java.io.File; 
import javax.swing.JFileChooser; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTree; 
import javax.swing.event.TreeModelListener; 
import javax.swing.tree.TreeModel; 
import javax.swing.tree.TreePath; 
import java.awt.Color; 
import java.awt.Component; 
import java.awt.Container; 
import java.awt.Dimension; 
import java.util.Arrays; 
import java.util.Collections; 
import java.util.Comparator; 
import java.util.Vector; 
import javax.swing.BoxLayout; 
import javax.swing.JFrame; 
import javax.swing.event.TreeSelectionEvent; 
import javax.swing.event.TreeSelectionListener; 
import javax.swing.filechooser.FileSystemView; 
import javax.swing.tree.DefaultMutableTreeNode; 
import javax.swing.tree.DefaultTreeCellRenderer; 

public class TestFileTree extends JPanel { 

    private File projectFile; 

    public TestFileTree(File dir) { 
     //Create file explorer 
     //Need to add setup for root folder change. 
     //Config.getProject(); //This gets the current file from the config file. 
     //Begin choose File 
     if (projectFile == null) { 
      JFileChooser chooser; 
      String choosertitle = "Please Choose a Root Folder"; 
      chooser = new JFileChooser(); 
      chooser.setCurrentDirectory(new java.io.File(".")); 
      chooser.setDialogTitle(choosertitle); 
      chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); 
      // 
      // disable the "All files" option. 
      // 
      chooser.setAcceptAllFileFilterUsed(false); 
      //  
      if (chooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) { 
       System.out.println("getCurrentDirectory(): " + chooser.getCurrentDirectory()); 
       System.out.println("getSelectedFile() : " + chooser.getSelectedFile()); 
       projectFile = new File(chooser.getSelectedFile().getAbsolutePath()); 
       //projectFile = chooser.getSelectedFile(); 
      } else { 
       System.out.println("No Selection "); 
      } 
     } else { 
      // Figure out where in the filesystem to start displaying 
     } 

     //End choose file 
     setLayout(new BorderLayout()); 

     // Make a tree list with all the nodes, and make it a JTree 
     JTree tree = new JTree(addNodes(null, projectFile)); 
     tree.setCellRenderer(new MyTreeCellRenderer()); 

     // Add a listener 
     tree.addTreeSelectionListener(new TreeSelectionListener() { 
      public void valueChanged(TreeSelectionEvent e) { 
       DefaultMutableTreeNode node = (DefaultMutableTreeNode) e 
         .getPath().getLastPathComponent(); 
       System.out.println("You selected " + node); 
      } 
     }); 

     // Lastly, put the JTree into a JScrollPane. 
     JScrollPane scrollpane = new JScrollPane(); 
     scrollpane.getViewport().add(tree); 
     add(BorderLayout.CENTER, scrollpane); 
    } 

    /** 
    * Add nodes from under "dir" into curTop. Highly recursive. 
    */ 
    DefaultMutableTreeNode addNodes(DefaultMutableTreeNode curTop, File dir) { 
     DefaultMutableTreeNode curDir = new DefaultMutableTreeNode(dir); 
     if (curTop != null) { // should only be null at root 
      curTop.add(curDir); 
     } 
     File[] tmp = dir.listFiles(); 
     Vector<File> ol = new Vector<File>(); 
     ol.addAll(Arrays.asList(tmp)); 
     Collections.sort(ol, new Comparator<File>() { 
      @Override 
      public int compare(File o1, File o2) { 

       int result = o1.getName().compareTo(o2.getName()); 

       if (o1.isDirectory() && o2.isFile()) { 
        result = -1; 
       } else if (o2.isDirectory() && o1.isFile()) { 
        result = 1; 
       } 

       return result; 
      } 
     }); 
     // Pass two: for files. 
     for (int fnum = 0; fnum < ol.size(); fnum++) { 
      File file = ol.elementAt(fnum); 
      DefaultMutableTreeNode node = new DefaultMutableTreeNode(file); 
      if (file.isDirectory()) { 
       addNodes(node, file); 
      } 
      curDir.add(node); 
     } 
     return curDir; 
    } 

    public Dimension getMinimumSize() { 
     return new Dimension(200, 400); 
    } 

    public Dimension getPreferredSize() { 
     return new Dimension(200, 400); 
    } 

    public static void main(String[] av) { 

     JFrame frame = new JFrame("FileTree"); 
     frame.setForeground(Color.black); 
     frame.setBackground(Color.lightGray); 
     Container cp = frame.getContentPane(); 

     if (av.length == 0) { 
      cp.add(new TestFileTree(new File("."))); 
     } else { 
      cp.setLayout(new BoxLayout(cp, BoxLayout.X_AXIS)); 
      for (int i = 0; i < av.length; i++) { 
       cp.add(new TestFileTree(new File(av[i]))); 
      } 
     } 

     frame.pack(); 
     frame.setVisible(true); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 

    public class MyTreeCellRenderer extends DefaultTreeCellRenderer { 

     private FileSystemView fsv = FileSystemView.getFileSystemView(); 

     @Override 
     public Component getTreeCellRendererComponent(JTree tree, Object value, boolean sel, boolean expanded, boolean leaf, int row, boolean hasFocus) { 
      System.out.println(value); 
      super.getTreeCellRendererComponent(tree, value, sel, expanded, leaf, row, hasFocus); 
      if (value instanceof DefaultMutableTreeNode) { 
       value = ((DefaultMutableTreeNode)value).getUserObject(); 
       if (value instanceof File) { 
        File file = (File) value; 
        if (file.isFile()) { 
         setIcon(fsv.getSystemIcon(file)); 
         setText(file.getPath()); 
        } else { 
         setIcon(fsv.getSystemIcon(file)); 
         setText(file.getName()); 
        } 
       } 
      } 
      return this; 
     } 
    } 
} 

Есть некоторые "интересные" части к вашему коду.

Хотя Vector не является плохим выбором, List (или, в данном случае, ArrayList) быстрее, так как он не синхронизирован.

Вместо того, используя петлю для добавления элементов в список, используйте Arrays.asList(...) для преобразования массива в список и использовать метод List#addAll (это в Vector а)

Я не уверен, какая версия Java вы используете, но теперь вы можете использовать for-each, так как Java 6 (я думаю), что означало бы вместо for (int i = 0; i < ol.size(); i++), вы могли бы сделать for (String thisObject : ol).

Поскольку вы используете генериков в ваших списках, вам не нужно бросать объекты;)

+0

+1 для 'TreeCellRenderer' – tenorsax

+1

' fsv.getSystemIcon (файл) 'Заметьте, что лучше выглядит с родным PLAF. См. Ссылку на «FileBrowserGui» в ответе trashgod для скриншота. –

+0

Большое спасибо! Теперь я начал работать правильно. –

Смежные вопросы