简体   繁体   English

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

[英]Display file(s) name and select it under the folder in JTree

I managed to come this far using stackoverflow examples, JTree displays all the system drives and folders, wanted to display all the corresponding files from the folder as well, got all the file names in a loop need to add them, that's where I got stuck! 我使用stackoverflow示例设法做到了这一点,JTree显示了所有系统驱动器和文件夹,还希望显示该文件夹中的所有相应文件,将所有文件名放入循环中需要添加它们,这就是我被困住的地方。 !

Please give me direction to add the files under the folder, Thanks! 请给我指示添加文件夹下文件的方向,谢谢!

CODE: 码:

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();
    }
}

Don't add all the file names in a loop. 不要在循环中添加所有文件名。 Instead, create a FileTreeModel that implements TreeModel , as shown here . 相反,创建一个FileTreeModel实现TreeModel ,如图所示这里 The implementation simply invokes the File method listFiles() in getChild() and getIndexOfChild() . 该实现仅调用getChild()getIndexOfChild()File方法listFiles() getIndexOfChild() Then you can create a tree and expand any desired row; 然后,您可以创建树并展开任何所需的行; use setSelectionPath() as shown here . 使用setSelectionPath()如图所示在这里

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

图片

I get only the c:\\ ; 我只得到c:\\ ; please give me directions to get all the system drives, etc. 请给我指示以获取所有系统驱动器等。

You can get a list of filesystem roots with File.listRoots() , as shown in Find all drive letters in Java , or FileSystemView#getRoots() , as shown in File Browser GUI . 您可以使用File.listRoots()获得文件系统根目录的列表,如“ 查找Java中的所有驱动器号”所示,或获得FileSystemView#getRoots() ,如文件浏览器GUI所示。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM