【发布时间】:2016-03-17 09:34:57
【问题描述】:
我使用 stackoverflow 示例设法走到了这一步,JTree 显示所有系统驱动器和文件夹,还想显示文件夹中的所有相应文件,循环获取所有文件名需要添加它们,这就是我卡住的地方!
请指导我添加文件夹下的文件,谢谢!
代码:
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();
}
}
【问题讨论】:
-
我认为我没有正确理解这个问题,但如果我理解了:只需删除包含
.isDirectory();的 if 语句。 -
感谢@LuxxMiner,如果我使用 .isDirectory(); 删除 if 语句,JTree 仅显示 c:\ 驱动器,但我希望显示所有系统驱动器、文件夹和文件JTree,对不起,我没有正确地提出问题
-
为什么只将这个dynamic layout code 包含在以后的
setLayout(null)中?如required,请引用使用的其他示例。 -
感谢@trashgod,我已经引用了我使用的环境中的所有示例。只有我删除发布问题。将确保坚持程序。
-
参见File Browser GUI,了解如何在树中使用好的图标。