Java 显示文件名并在JTree中的文件夹下选择它
我通过使用stackoverflow示例实现了这一点,JTree显示了所有系统驱动器和文件夹,还想显示文件夹中的所有对应文件,在循环中获得了所有文件名,需要添加它们,这就是我遇到的问题 请告诉我如何添加文件夹下的文件,谢谢 代码:Java 显示文件名并在JTree中的文件夹下选择它,java,swing,jtree,Java,Swing,Jtree,我通过使用stackoverflow示例实现了这一点,JTree显示了所有系统驱动器和文件夹,还想显示文件夹中的所有对应文件,在循环中获得了所有文件名,需要添加它们,这就是我遇到的问题 请告诉我如何添加文件夹下的文件,谢谢 代码: public class viewGui extends JFrame { private FileSystemView fileSystemView; private Desktop desktop; private static fina
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();
}
}
公共类viewGui扩展了JFrame{
私有文件系统视图文件系统视图;
私人桌面;
私有静态最终长serialVersionUID=1083130296343096642L;
公共静态JTree树;
私有DefaultTreeModel树模型;
专用JTable表;
私有ListSelectionListener ListSelectionListener;
私有静态最终布局管理器H=新网格布局(1,0);
私有静态最终布局管理器V=新网格布局(0,1);
公共静态void main(字符串[]args){
invokeLater(新的Runnable(){
@凌驾
公开募捐{
试一试{
viewGui主窗口=新viewGui();
mainWindow.setVisible(true);
}捕获(例外e){
e、 printStackTrace();
}
}
});
}
公共视图GUI(){
fileSystemView=fileSystemView.getFileSystemView();
desktop=desktop.getDesktop();
本文件标题为(“学生记录簿”);
getContentPane().setLayout(H);
getContentPane().setLayout(V);
此.setPreferredSize(新尺寸(1200800));
此.setExtendedState(正常);
此.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.getContentPane().setLayout(null);
此参数为.setresizeable(true);
DefaultMutableTreeNode根=新的DefaultMutableTreeNode();
treeModel=新的DefaultTreeModel(根);
TreeSelectionListener TreeSelectionListener=新建TreeSelectionListener(){
公共作废值已更改(TreeSelectionEvent tse){
DefaultMutableTreeNode=(DefaultMutableTreeNode)tse.getPath().getLastPathComponent();
System.out.println(“节点:“+Node”);
显示子节点;
}
};
File[]root=fileSystemView.getroot();
用于(文件系统根:根){
DefaultMutableTreeNode=新的DefaultMutableTreeNode(fileSystemRoot);
root.add(节点);
File[]files=fileSystemView.getFiles(fileSystemRoot,true);
用于(文件:文件){
if(file.isDirectory()){
添加(新的DefaultMutableTreeNode(文件));
}
}
}
树=新的JTree(树模型);
树.立根(10,11,387,740);
tree.setRootVisible(false);
addTreeSelectionListener(treeSelectionListener);
tree.expandRow(0);
JScrollPane treeScroll=新的JScrollPane(树);
树。设置VisibleRowCount(15);
维度preferredSize=treeScroll.getPreferredSize();
维度widePreferred=新维度(200,(int)preferredSize.getHeight());
树卷。设置首选尺寸(首选宽度);
这是setLayout(H);
这个。validate();
添加(treeScroll,BorderLayout.WEST);
这个包();
此.setLocationRelativeTo(空);
此.setVisible(true);
table=新的JTable();
表.setSelectionMode(ListSelectionModel.SINGLE_选择);
表.setAutoCreateRowSorter(真);
表1.设置显示(假);
listSelectionListener=新建listSelectionListener(){
@凌驾
公共作废值已更改(ListSelectionEvent lse){
int row=table.getSelectionModel().getLeadSelectionIndex();
}
};
table.getSelectionModel().addListSelectionListener(listSelectionListener);
JScrollPane tableScroll=新的JScrollPane(表);
维度d=tableScroll.getPreferredSize();
tableScroll.setPreferredSize(新维度((int)d.getWidth(),(int)d.getHeight()/2));
getContentPane().add(tableScroll,BorderLayout.CENTER);
}
私有void showChildren(最终默认MutableTreeNode节点){
tree.setEnabled(false);
SwingWorker worker=新SwingWorker(){
@凌驾
公共无效doInBackground(){
File=(File)node.getUserObject();
if(file.isDirectory()){
File[]files=fileSystemView.getFiles(File,true);/!!
if(node.isLeaf()){
用于(文件子项:文件){
System.out.println(“child:+child”);
if(child.isDirectory()){
出版(儿童);
//需要在文件夹下添加文件名
}
}
}
}
返回null;
}
@凌驾
受保护的无效进程(列表块){
for(文件子项:块){
添加(新的DefaultMutableTreeNode(子节点));
if(child.isDirectory()){
}
}
}
@凌驾
受保护的void done(){
tree.setEnabled(true);
}
};
worker.execute();
}
}
不要在循环中添加所有文件名。相反,创建一个实现的FileTreeModel
,如图所示。实现只需调用getChild()
和getIndexOfChild()
中的File
方法listFiles()
。然后您可以创建一棵树并展开任何所需的行;使用setSelectionPath()
,如图所示
我只得到c:\
;请直接告诉我
TreeModel model = new FileTreeModel(new File(System.getProperty("user.dir")));
JTree tree = new JTree(model);
tree.expandRow(0);