首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用JTree ENTER启动JTextField

使用JTree ENTER启动JTextField
EN

Stack Overflow用户
提问于 2022-01-30 19:36:38
回答 1查看 95关注 0票数 0

我是个新手,JTree让我很难过。不能继续下去了。希望你能帮我。我真正想要的是,正确地显示一个JTextFieldJTree,当我从我的PC上写一个路径时,我想看到所有的文件夹和文件,就像在JTree中一样。我做了些事,但真的希望你能帮我。谢谢。

代码语言:javascript
复制
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);
            }
        });
    }
}
EN

回答 1

Stack Overflow用户

发布于 2022-02-04 05:51:15

我重写了你的代码。

我不清楚为什么您有两个JTree,下面的代码只填充左边的树。

(说明出现在代码之后。)

代码语言:javascript
复制
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);
    }
}
  • 的内容窗格。的默认的内容窗格。BorderLayout,因此不需要显式设置它。
  • 为了并行显示JTree,我使用了GridLayout,但是还有其他布局管理器将实现相同的结果。
  • 您输入到JTextField的路径下的文件越多,显示结果所需的时间就越长。这就是为什么在构建树时,我将光标设置为“等待”游标。请注意,这并不阻止用户使用鼠标,但是在构建树时,事件调度线程 (EDT)无论如何都不能对鼠标单击做出响应。基本上,这是对用户的一个提示,说明应用程序很忙。您可能需要考虑使用SwingWorker
  • 方法expandAllNodes是从这个问题的答案中复制出来的:完全展开Jtree的所有节点(包括子节点)
  • this::walkFileTree方法参考的语法。
  • 如何使用树木

下面是一个屏幕截图:

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70918222

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档