显示文件名称并在JTree中的文件夹下选择它 [英] Display file(s) name and select it under the folder in JTree

查看:106
本文介绍了显示文件名称并在JTree中的文件夹下选择它的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我设法使用 stackoverflow 示例,JTree显示所有系统驱动器和文件夹,想要显示文件夹中的所有相应文件,在循环中获取所有文件名需要添加它们,这就是我被卡住的地方!



请指教我添加文件夹下的文件,谢谢!



代码:

 公共类viewGui扩展JFrame {

私有FileSystemView fileSystemView;
私人桌面桌面;
private static final long serialVersionUID = 1083130296343096642L;
公共静态JTree树;
private DefaultTreeModel treeModel;
私有JTable表;
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(学生记录簿);
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(文件文件: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);
维度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);
//需要在文件夹
下添加文件名}
}
}
}
返回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不要在循环中添加所有文件名。相反,创建一个实现,或 FileSystemView#getRoots(),如所示文件浏览器GUI


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!

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. The implementation simply invokes the File method listFiles() in getChild() and getIndexOfChild(). Then you can create a tree and expand any desired row; use setSelectionPath() as shown here.

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

I get only the 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.

这篇关于显示文件名称并在JTree中的文件夹下选择它的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆