Swing дерево из Open-диалога - Java
Формулировка задачи:
Приветствую!
Столкнулся с проблемой в программировании событий Java(eclipse) с пакетом Swing. Форма такая:
Кнопка Open открывает диалог.
В диалоге мы что-то выбрали.
Нажимаем на кнопку refresh.
==> Если выбран файл, нужно вывести его полный путь в консоль. Если выбрана директория, то нужно вывести её в дерево (под кнопками).
Кое-что я написал, но не получается дерево обновить:
import java.awt.EventQueue;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JButton;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.io.File;
public class Frame1 {
private JFrame frame;
static String file = "";
static String dir = "";
static String message = "";
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
Frame1 window = new Frame1();
window.frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* getList
*/
public void getList(DefaultMutableTreeNode node, File f) {
if (!f.isDirectory()) {
// Text
if (f.getName().endsWith("txt")) {
System.out.println("FILE - " + f.getName());
DefaultMutableTreeNode child = new DefaultMutableTreeNode(f);
node.add(child);
}
} else {
System.out.println("DIRECTORY - " + f.getName());
DefaultMutableTreeNode child = new DefaultMutableTreeNode(f);
node.add(child);
File fList[] = f.listFiles();
for (int i = 0; i < fList.length; i++)
getList(child, fList[i]);
}
}
/**
* Create the application.
*/
public Frame1() {
initialize();
}
/**
* Initialize the contents of the frame.
*/
private void initialize() {
frame = new JFrame();
frame.setResizable(false);
frame.setBounds(100, 100, 450, 300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().setLayout(null);
JButton btnNewButton = new JButton("Open");
btnNewButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
// Open диалог
JFileChooser chooser = new JFileChooser();
chooser.setCurrentDirectory(new java.io.File("."));
chooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
chooser.setAcceptAllFileFilterUsed(false);
if (chooser.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) {
if (chooser.getSelectedFile().isFile()) {
file = chooser.getSelectedFile().toString();
System.out.println("file: "+file);
}
if (chooser.getSelectedFile().isDirectory()) {
dir = chooser.getCurrentDirectory().toString();
System.out.println("dir: "+dir);
}
} else {
message = "No Selection";
}
}
});
btnNewButton.setBounds(10, 11, 89, 23);
frame.getContentPane().add(btnNewButton);
// На старте дерево пусто
DefaultMutableTreeNode root = new DefaultMutableTreeNode("", true);
JTree tree = new JTree(root);
tree.setBounds(10, 45, 424, 215);
frame.getContentPane().add(tree);
JButton btnNewButton_1 = new JButton("Refresh");
btnNewButton_1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
/*??????????????????*/
/*Дерево обновляется по нажатию кнопки Refresh*/
if (dir != "") {
DefaultMutableTreeNode root = new DefaultMutableTreeNode("root", true);
getList(root, new File(dir));
JTree tree = new JTree(root);
tree.setBounds(105, 45, 319, 206);
frame.getContentPane().add(tree);
}
/*??????????????????*/
}
});
btnNewButton_1.setBounds(109, 11, 89, 23);
frame.getContentPane().add(btnNewButton_1);
}
}Решение задачи: «Swing дерево из Open-диалога»
textual
Листинг программы
package app1;
import java.awt.BorderLayout;
import java.awt.EventQueue;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JButton;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.io.File;
import javax.swing.JScrollPane;
import javax.swing.tree.DefaultTreeModel;
public class Frame1 extends JFrame {
private DefaultMutableTreeNode root;
private DefaultTreeModel model;
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
new Frame1();
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
private JTree tree;
public Frame1() {
initialize();
}
private void initialize() {
setBounds(100, 100, 450, 300);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(new BorderLayout());
root = new DefaultMutableTreeNode("Root");
model = new DefaultTreeModel(root);
JButton btnOpen = new JButton("Open");
btnOpen.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
JFileChooser chooser = new JFileChooser();
chooser.setCurrentDirectory(new java.io.File("."));
chooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
chooser.setAcceptAllFileFilterUsed(false);
if (chooser.showOpenDialog(Frame1.this) == JFileChooser.APPROVE_OPTION) {
File selectedFile = chooser.getSelectedFile();
if (selectedFile.isFile()) {
root = new DefaultMutableTreeNode(selectedFile.toString());
System.out.println(selectedFile.toString());
} else {
if (selectedFile.isDirectory()) {
root = new DefaultMutableTreeNode(selectedFile.getName());
String[] directories = selectedFile.list();
for (String d : directories) {
root.add(new DefaultMutableTreeNode(d));
}
}
}
model.setRoot(root);
}
}
});
add(btnOpen, BorderLayout.SOUTH);
tree = new JTree();
tree.setModel(model);
JScrollPane scrollPane = new JScrollPane(tree);
add(scrollPane, BorderLayout.CENTER);
setVisible(true);
}
}