显示文件名称并在JTree中的文件夹下选择它

我设法使用stackoverflow示例到目前为止,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 worker = new SwingWorker() { @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 chunks) { for (File child : chunks) { node.add(new DefaultMutableTreeNode(child)); if (child.isDirectory()){ } } } @Override protected void done() { tree.setEnabled(true); } }; worker.execute(); } } 

不要在循环中添加所有文件名。 相反,创建一个实现TreeModelFileTreeModel ,如下所示。 该实现只是在getChild()getIndexOfChild()调用File方法listFiles() getIndexOfChild() 。 然后,您可以创建一个树并展开任何所需的行; 使用setSelectionPath() ,如下所示。

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

图片

我只得到c:\ ; 请给我指示获取所有系统驱动器等。

您可以使用File.listRoots()获取文件系统根目录,如在Java查找所有驱动器号FileSystemView#getRoots()中所示,如文件浏览器GUI中所示。