2015-12-11 2 views
1

Мне удалось зайти так далеко, используя примеров stackoverflow, JTree отображает все системные диски и папки, также хотел отобразить все соответствующие файлы из папки , получил все имена файлов в цикле, чтобы их добавить, вот где я застрял!Показать имя файла (ы) и выбрать его под папкой в ​​JTree

Пожалуйста, дайте мне направление, чтобы добавить файлы под папку, Спасибо!

КОД:

public class viewGui extends JFrame { 

    private FileSystemView fileSystemView; 
    private Desktop desktop; 
    private static final long serialVersionUID = 1083130296343096642L; 
    public static JTree tree; 
    private DefaultTreeModel treeModel; 
    private JTable table; 
    private ListSelectionListener listSelectionListener; 

    private static final LayoutManager H = new GridLayout(1, 0); 
    private static final LayoutManager V = new GridLayout(0, 1); 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        viewGui mainWindow = new viewGui(); 
        mainWindow.setVisible(true); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 
    } 

    public viewGui() { 

     fileSystemView = FileSystemView.getFileSystemView(); 
     desktop = Desktop.getDesktop(); 

     this.setTitle("Student Record Book"); 
     getContentPane().setLayout(H); 
     getContentPane().setLayout(V); 
     this.setPreferredSize(new Dimension(1200, 800)); 
     this.setExtendedState(NORMAL); 
     this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     this.getContentPane().setLayout(null); 
     this.setResizable(true); 

     DefaultMutableTreeNode root = new DefaultMutableTreeNode(); 
     treeModel = new DefaultTreeModel(root); 

     TreeSelectionListener treeSelectionListener = new TreeSelectionListener() { 
      public void valueChanged(TreeSelectionEvent tse){ 
       DefaultMutableTreeNode node = (DefaultMutableTreeNode)tse.getPath().getLastPathComponent(); 
       System.out.println("Node: "+node); 
       showChildren(node); 
      } 
     }; 

     File[] roots = fileSystemView.getRoots(); 
     for (File fileSystemRoot : roots) { 
      DefaultMutableTreeNode node = new DefaultMutableTreeNode(fileSystemRoot); 
      root.add(node); 
      File[] files = fileSystemView.getFiles(fileSystemRoot, true); 
      for (File file : files) { 
       if (file.isDirectory()) { 
        node.add(new DefaultMutableTreeNode(file)); 
       } 
      } 
     } 

     tree = new JTree(treeModel); 
     tree.setBounds(10, 11, 387, 740); 
     tree.setRootVisible(false); 
     tree.addTreeSelectionListener(treeSelectionListener); 
     tree.expandRow(0); 
     JScrollPane treeScroll = new JScrollPane(tree); 

     tree.setVisibleRowCount(15); 

     Dimension preferredSize = treeScroll.getPreferredSize(); 
     Dimension widePreferred = new Dimension(200,(int)preferredSize.getHeight()); 
     treeScroll.setPreferredSize(widePreferred); 

     this.setLayout(H); 
     this.validate(); 
     this.add(treeScroll, BorderLayout.WEST); 
     this.pack(); 
     this.setLocationRelativeTo(null); 
     this.setVisible(true); 

     table = new JTable(); 
     table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 
     table.setAutoCreateRowSorter(true); 
     table.setShowVerticalLines(false); 

     listSelectionListener = new ListSelectionListener() { 
      @Override 
      public void valueChanged(ListSelectionEvent lse) { 
       int row = table.getSelectionModel().getLeadSelectionIndex(); 
      } 
     }; 

     table.getSelectionModel().addListSelectionListener(listSelectionListener); 
     JScrollPane tableScroll = new JScrollPane(table); 
     Dimension d = tableScroll.getPreferredSize(); 
     tableScroll.setPreferredSize(new Dimension((int)d.getWidth(), (int)d.getHeight()/2)); 
     getContentPane().add(tableScroll, BorderLayout.CENTER); 


    } 

    private void showChildren(final DefaultMutableTreeNode node) { 
     tree.setEnabled(false); 

     SwingWorker<Void, File> worker = new SwingWorker<Void, File>() { 
      @Override 
      public Void doInBackground() { 
       File file = (File) node.getUserObject(); 
       if (file.isDirectory()) { 
        File[] files = fileSystemView.getFiles(file, true); //!! 
        if (node.isLeaf()) { 
         for (File child : files) { 

          System.out.println("child:"+child); 
          if (child.isDirectory()) { 
           publish(child); 
           //Need to add the file names under the folder 
          } 
         } 
        } 
       } 
       return null; 
      } 

      @Override 
      protected void process(List<File> chunks) { 
       for (File child : chunks) { 
        node.add(new DefaultMutableTreeNode(child)); 
        if (child.isDirectory()){ 

        } 
       } 
      } 

      @Override 
      protected void done() { 
       tree.setEnabled(true); 
      } 
     }; 
     worker.execute(); 
    } 
} 
+0

Я не думаю, что я правильно понял вопрос, но если бы я это сделал: просто удалите if-statements, содержащие '.isDirectory();'. –

+0

Спасибо @LuxxMiner, если я удаляю if-statements с .isDirectory() ;, JTree показывает только диск c: \, но я хочу, чтобы все системные диски, папки и файлы отображались на JTree, sry I didn ' t правильно задать вопрос –

+0

Зачем включать этот [динамический код макета] (http://stackoverflow.com/a/5751044/230513) только для более позднего 'setLayout (null)'? В качестве [обязательного] (http://stackexchange.com/legal), пожалуйста, укажите другие используемые примеры. – trashgod

ответ

7

Не добавлять имена всех файлов в цикле. Вместо этого создайте FileTreeModel, который реализует TreeModel, как показано на рисунке here. Реализация просто вызывает метод FilelistFiles() в getChild() и getIndexOfChild(). Затем вы можете создать дерево и расширить любую желаемую строку; использовать setSelectionPath() как показано here.

TreeModel model = new FileTreeModel(new File(System.getProperty("user.dir"))); 
JTree tree = new JTree(model); 
tree.expandRow(0); 

image

я получаю только c:\; пожалуйста, дайте мне направление, чтобы получить все системные диски и т.д.

Вы можете получить список файловых систем корней с File.listRoots(), как показано на Find all drive letters in Java или FileSystemView#getRoots(), как показано на File Browser GUI.

+0

Спасибо @trashgod, я попробовал [простой пример] (http://pastebin.com/9kFfhXQY) на основе вашего предложения, но я получаю только c: \, пожалуйста, дайте мне указания, чтобы получить все системные диски, папки и файлы, пожалуйста! –

+0

Я разработал выше. – trashgod

+0

Спасибо @trashgod, будет работать над этим. Спасибо –