我是个新手,JTree让我很难过。不能继续下去了。希望你能帮我。我真正想要的是,正确地显示一个JTextField和JTree,当我从我的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);
}
});
}
}发布于 2022-02-04 05:51:15
我重写了你的代码。
我不清楚为什么您有两个JTree,下面的代码只填充左边的树。
(说明出现在代码之后。)
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是方法参考的语法。下面是一个屏幕截图:

https://stackoverflow.com/questions/70918222
复制相似问题