【问题标题】:Display file(s) name and select it under the folder in JTree显示文件名并在 JTree 中的文件夹下选择它
【发布时间】:2016-03-17 09:34:57
【问题描述】:

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

【问题讨论】:

  • 我认为我没有正确理解这个问题,但如果我理解了:只需删除包含 .isDirectory(); 的 if 语句。
  • 感谢@LuxxMiner,如果我使用 .isDirectory(); 删除 if 语句,JTree 仅显示 c:\ 驱动器,但我希望显示所有系统驱动器、文件夹和文件JTree,对不起,我没有正确地提出问题
  • 为什么只将这个dynamic layout code 包含在以后的setLayout(null) 中?如required,请引用使用的其他示例。
  • 感谢@trashgod,我已经引用了我使用的环境中的所有示例。只有我删除发布问题。将确保坚持程序。
  • 参见File Browser GUI,了解如何在树中使用好的图标。

标签: java swing jtree


【解决方案1】:

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

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

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

您可以使用File.listRoots() 获取文件系统根列表,如Find all drive letters in JavaFileSystemView#getRoots(),如File Browser GUI 所示。

【讨论】:

  • 谢谢@trashgod,我根据你的建议尝试了simple example,但我只得到了c:\,请给我指示以获取所有系统驱动器、文件夹和文件!
  • 我已经在上面详细说明了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-02-15
  • 1970-01-01
  • 2020-04-20
  • 1970-01-01
  • 2019-10-08
  • 1970-01-01
  • 2015-01-23
相关资源
最近更新 更多