【问题标题】:Start the JTree with JTextField ENTER使用 JTextField ENTER 启动 JTree
【发布时间】:2022-01-30 19:36:38
【问题描述】:

我是新手,JTree 让我很伤心。坚持不下去了所以希望,你能帮助我。 我真正想要的是,正确显示JTextFieldJTree,当我从PC 写入路径时,我想查看JTree 中的所有文件夹和文件。 我做了一些事情,但真的希望你能帮助我。谢谢。

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;

public class Main extends JFrame {
    JTextField path = new JTextField();

    public static void main(String[] args) {
        new Main().setVisible(true);
    }

    private JTree jTree1;
    private JTree jTree2;
    File fileRoot;
    File fileRoot2;
    DefaultMutableTreeNode root = new DefaultMutableTreeNode(fileRoot);
    DefaultTreeModel model = new DefaultTreeModel(root);
    DefaultMutableTreeNode root2 = new DefaultMutableTreeNode(fileRoot2);
    DefaultTreeModel model2 = new DefaultTreeModel(root2);

    public Main() {
        setLayout(new BorderLayout());
        this.jTree1 = new JTree();
        this.add(this.jTree1);
        this.jTree2 = new JTree();
        this.add(this.jTree2);
        JScrollPane scrollpane = new JScrollPane();
        scrollpane.setBounds(100, 100, 100, 300);
        scrollpane.getViewport().add(jTree1);
        add(BorderLayout.NORTH, path);
        add(BorderLayout.WEST, scrollpane);
        JScrollPane scrollpane2 = new JScrollPane();
        scrollpane2.getViewport().add(jTree2);
        add(BorderLayout.EAST, scrollpane2);
        this.jTree1.setModel(model);
        this.jTree2.setModel(model2);
        this.pack();
        path.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                String JtreeString = path.getText().toString().replaceAll("[\\[\\]]", "")
                        .replace(", ", "\\");
                fileRoot = new File(JtreeString);
                File[] files = fileRoot.listFiles();
                for (File file : files) {
                    root.add(new DefaultMutableTreeNode(file));
                }
                model.reload(root);
            }
        });
    }
}

【问题讨论】:

    标签: java swing jtextfield keypress jtree


    【解决方案1】:

    我重写了你的代码。
    我不清楚为什么你有两个JTrees。以下代码仅填充左侧树。
    (说明出现在代码后面。)

    import java.awt.BorderLayout;
    import java.awt.Cursor;
    import java.awt.Dimension;
    import java.awt.EventQueue;
    import java.awt.GridLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.KeyEvent;
    import java.io.File;
    import java.nio.file.Path;
    import java.nio.file.Paths;
    
    import javax.swing.BorderFactory;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.JTextField;
    import javax.swing.JTree;
    import javax.swing.tree.DefaultMutableTreeNode;
    import javax.swing.tree.DefaultTreeModel;
    
    public class FileTree implements Runnable {
        private DefaultTreeModel  leftModel;
        private JFrame  frame;
        private JTextField  filePathTextField;
        private JTree  leftTree;
        private JTree  rightTree;
    
        public void run() {
            createAndDisplayGui();
        }
    
        private void createAndDisplayGui() {
            frame = new JFrame("File Tree");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.add(createTopPanel(), BorderLayout.PAGE_START);
            frame.add(createTreesPanel(), BorderLayout.CENTER);
            frame.pack();
            frame.setLocationByPlatform(true);
            frame.setVisible(true);
        }
    
        private JPanel createTopPanel() {
            JPanel topPanel = new JPanel();
            topPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
            JLabel label = new JLabel("Root Path");
            label.setDisplayedMnemonic(KeyEvent.VK_R);
            label.setLabelFor(filePathTextField);
            topPanel.add(label);
            filePathTextField = new JTextField(20);
            filePathTextField.addActionListener(this::walkFileTree);
            topPanel.add(filePathTextField);
            return topPanel;
        }
    
        private JPanel createTreesPanel() {
            JPanel treesPanel = new JPanel(new GridLayout(1, 0, 10, 0));
            treesPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
            leftTree = new JTree(new DefaultTreeModel(null));
            leftTree.setShowsRootHandles(true);
            JScrollPane leftScrollPane = new JScrollPane(leftTree);
            leftScrollPane.setPreferredSize(new Dimension(300, 300));
            treesPanel.add(leftScrollPane);
            rightTree = new JTree(new DefaultTreeModel(null));
            JScrollPane rightScrollPane = new JScrollPane(rightTree);
            rightScrollPane.setPreferredSize(new Dimension(300, 300));
            treesPanel.add(rightScrollPane);
            return treesPanel;
        }
    
        private void expandAllNodes(JTree tree, int startingIndex, int rowCount){
            for (int i = startingIndex; i < rowCount; ++i) {
                tree.expandRow(i);
            }
            if (tree.getRowCount() != rowCount) {
                expandAllNodes(tree, rowCount, tree.getRowCount());
            }
        }
    
        private void walkFileTree(ActionEvent event) {
            Object source = event.getSource();
            if (source == filePathTextField) {
                frame.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
                String text = filePathTextField.getText();
                Path rootPath = Paths.get(text);
                File rootFile = rootPath.toFile();
                DefaultMutableTreeNode root = new DefaultMutableTreeNode(rootFile);
                leftModel = new DefaultTreeModel(root);
                leftTree.setModel(leftModel);
                walkTree(root, rootFile);
                expandAllNodes(leftTree, 0, leftTree.getRowCount());
                frame.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
            }
        }
    
        private void walkTree(DefaultMutableTreeNode parent, File f) {
            if (f.isDirectory()) {
                File[] files = f.listFiles();
                for (File file : files) {
                    DefaultMutableTreeNode node = new DefaultMutableTreeNode(file);
                    parent.add(node);
                    if (file.isDirectory()) {
                        walkTree(node, file);
                    }
                }
            }
        }
    
        public static void main(String[] args) {
            FileTree gui = new FileTree();
            EventQueue.invokeLater(gui);
        }
    }
    
    • JFrame 的 [内容窗格] 的默认 layout managerBorderLayout,因此无需显式设置。
    • 为了并排显示JTrees,我使用了GridLayout,但还有其他布局管理器可以达到相同的效果。
    • 您在JTextField 中输入路径的文件下的文件越多,显示结果所需的时间就越长。这就是我在构建树时将光标设置为“等待”光标的原因。请注意,这不会阻止用户使用鼠标,但是在构建树时,event dispatch thread (EDT) 无论如何都无法响应鼠标点击。基本上它是向用户提示应用程序正忙。您可能需要考虑使用SwingWorker
    • 方法 expandAllNodes 是从这个 SO 问题的答案中复制的:Completely expand all node of a Jtree (including children)
    • this::walkFileTreemethod reference 的语法。
    • How to Use Trees

    这是一个屏幕截图:

    【讨论】:

      猜你喜欢
      • 2015-10-29
      • 1970-01-01
      • 1970-01-01
      • 2012-07-31
      • 1970-01-01
      • 2015-11-16
      • 1970-01-01
      • 1970-01-01
      • 2020-09-10
      相关资源
      最近更新 更多