您的代码存在许多问题,但是......我遇到的主要问题是,当您重新加载模型时,根节点默认会折叠。
如果根节点被隐藏和/或它的句柄被隐藏,它将显示为好像没有加载任何内容。
取消隐藏这些元素以进行测试。
重新加载模型后,您还可以展开根节点...
! 警告 !! 不要在你的根目录上运行它!! 它将扫描所有子目录,这可能需要更多时间,然后您实际上愿意等待:P
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreePath;
public class FileTree {
public static void main(String[] args) {
new FileTree();
}
public FileTree() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class TestPane extends JPanel {
private DefaultTreeModel model;
private JTree tree;
public TestPane() {
setLayout(new BorderLayout());
tree = new JTree();
File rootFile = new File(".");
DefaultMutableTreeNode root = new DefaultMutableTreeNode(rootFile);
model = new DefaultTreeModel(root);
tree.setModel(model);
tree.setRootVisible(true);
tree.setShowsRootHandles(true);
add(new JScrollPane(tree));
JButton load = new JButton("Load");
add(load, BorderLayout.SOUTH);
load.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
DefaultMutableTreeNode root = (DefaultMutableTreeNode) model.getRoot();
root.removeAllChildren();
model.reload();
File rootFile = (File) root.getUserObject();
addFiles(rootFile, model, root);
tree.expandPath(new TreePath(root));
}
});
}
@Override
public Dimension getPreferredSize() {
return new Dimension(200, 200);
}
protected void addFiles(File rootFile, DefaultTreeModel model, DefaultMutableTreeNode root) {
for (File file : rootFile.listFiles()) {
DefaultMutableTreeNode child = new DefaultMutableTreeNode(file);
model.insertNodeInto(child, root, root.getChildCount());
if (file.isDirectory()) {
addFiles(file, model, child);
}
}
}
}
}
代码审查
您应该避免直接从JFrame扩展。 从你的例子来看,你不是,但是入侵了它,但无论如何它都是不可取的......
这个...
jtrMainMenu.setPreferredSize(new Dimension(300, 150));
add(jtrMainMenu, BorderLayout.CENTER);
这是不可取的。 应将JTree添加到JScrollPane 。
这个...
private static void createAndShowGUI() {
//Create and set up the window.
JFrame frame = new JFrame("DynamicTreeDemo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//Create and set up the content pane.
BadTree newContentPane = new BadTree();
newContentPane.setOpaque(true); //content panes must be opaque
frame.setContentPane(newContentPane);
//Display the window.
frame.pack();
frame.setVisible(true);
}
也不会工作(根据您的示例),因为从Window扩展的任何内容都无法添加到任何其他扩展Window容器中
除非您的基本组件是从JComponent扩展的,否则其他组件必须是不透明的( JLabel是一个明显的例外),因此将newContentPane设置为opaque可能是一个静音点。