我想达到的目的很简单 两个list 最初list1中c盘下是文件夹 list2是c盘下文件 接下来只要实现点击list1中任意文件夹 list1变化为任意文件夹中的文件夹 list2变化为任意文件夹中的文件 这种点击可以一直下去只要list1中有文件夹public NewJFrame() {
initComponents();
aaa();
} private void initComponents() {
}// 这里是对于list1 list2得设定
private void aaa() {//显示文件与文件夹
File f = new File("c://");
File file;
String[] m_dir = f.list();
for (int i = 0; i < m_dir.length; i++) {
file = new File("c://" + m_dir[i]);
if (file.isDirectory()) {
list1.add(m_dir[i]);//list1是c盘下文件夹
} else {
list2.add(m_dir[i]);////list2是c盘下文件
}
}
}
private void list1MouseClicked(java.awt.event.MouseEvent evt) { //这是双击事件
File file;
if (evt.getClickCount() == 2) { //双击
System.out.println(list1.getSelectedItem());
File file1 = new File(list1.getSelectedItem());//找到file1
System.out.println("n=" + file1.getParent());//
if (file1.getParent().isEmpty()) { //如果file1得父目录为空则
File file2 = new File("c://" + list1.getSelectedItem());//file2的路径是c://所点击文件名
System.out.println(file2);
list1.removeAll();//清空list1 以便出现子目录文件夹
list2.removeAll();//晴空list2 以便出现子目录文件
String[] m_dir = file2.list();//所有子目录下文件文件夹
for (int i = 0; i < m_dir.length; i++) {
file = new File(file2.toString() + "//" + m_dir[i]);
if (file.isDirectory()) {
list1.add(m_dir[i]);//文件夹添加到list1
System.out.println(m_dir[i]);
} else {
list2.add(m_dir[i]);//文件添加到list2
} }
} else {//父目录不是空
File file2 = new File(file1.getParent() + list1.getSelectedItem());//file2是父目录/所点击文件夹
System.out.println(file2.getPath());
list1.removeAll();//清空list1 以便出现子目录文件夹
list2.removeAll();//清空list2 以便出现子目录文件
String[] m_dir = file1.list();//以下同上
for (int i = 0; i < m_dir.length; i++) {
file = new File(file2.toString() + "//" + m_dir[i]);
if (file.isDirectory()) {
list1.add(m_dir[i]);
System.out.println(m_dir[i]);
} else {
list2.add(m_dir[i]);
} }
}
}
}
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() { public void run() {
new NewJFrame().setVisible(true);
}
});
} private java.awt.List list1;
private java.awt.List list2;}
initComponents();
aaa();
} private void initComponents() {
}// 这里是对于list1 list2得设定
private void aaa() {//显示文件与文件夹
File f = new File("c://");
File file;
String[] m_dir = f.list();
for (int i = 0; i < m_dir.length; i++) {
file = new File("c://" + m_dir[i]);
if (file.isDirectory()) {
list1.add(m_dir[i]);//list1是c盘下文件夹
} else {
list2.add(m_dir[i]);////list2是c盘下文件
}
}
}
private void list1MouseClicked(java.awt.event.MouseEvent evt) { //这是双击事件
File file;
if (evt.getClickCount() == 2) { //双击
System.out.println(list1.getSelectedItem());
File file1 = new File(list1.getSelectedItem());//找到file1
System.out.println("n=" + file1.getParent());//
if (file1.getParent().isEmpty()) { //如果file1得父目录为空则
File file2 = new File("c://" + list1.getSelectedItem());//file2的路径是c://所点击文件名
System.out.println(file2);
list1.removeAll();//清空list1 以便出现子目录文件夹
list2.removeAll();//晴空list2 以便出现子目录文件
String[] m_dir = file2.list();//所有子目录下文件文件夹
for (int i = 0; i < m_dir.length; i++) {
file = new File(file2.toString() + "//" + m_dir[i]);
if (file.isDirectory()) {
list1.add(m_dir[i]);//文件夹添加到list1
System.out.println(m_dir[i]);
} else {
list2.add(m_dir[i]);//文件添加到list2
} }
} else {//父目录不是空
File file2 = new File(file1.getParent() + list1.getSelectedItem());//file2是父目录/所点击文件夹
System.out.println(file2.getPath());
list1.removeAll();//清空list1 以便出现子目录文件夹
list2.removeAll();//清空list2 以便出现子目录文件
String[] m_dir = file1.list();//以下同上
for (int i = 0; i < m_dir.length; i++) {
file = new File(file2.toString() + "//" + m_dir[i]);
if (file.isDirectory()) {
list1.add(m_dir[i]);
System.out.println(m_dir[i]);
} else {
list2.add(m_dir[i]);
} }
}
}
}
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() { public void run() {
new NewJFrame().setVisible(true);
}
});
} private java.awt.List list1;
private java.awt.List list2;}
就是在检查父目录是否为空 好像不起作用
System.out.println这样的语句只是我自己检查用
与程序达到效果无关
1.不是// 而应该是\\ (C:\\
2.没有初始化LIST
3.没有把LIST加到画面上
list1.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
list1MouseClicked(e);
}
});
这个是得不到文件的,因为没有C:\\在前面
3错误 我没贴出来 是自动生成的画面
去除编译错误
然后用debug调试,什么地方出错了,马上就知道了
你的代码,我没有做更改,我用注释指出了一些问题。希望你仔细思考。
import java.awt.List;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.File;import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;public class NewJFrame extends JFrame { /**
* 这两个东西一定要通过new关键字初始化出来, 不然会抛出java.lang.NullPointerException
*/
private List list1 = new List();
private List list2 = new List();
public NewJFrame() {
initComponents();
aaa(); setSize(600, 480);
setDefaultCloseOperation(EXIT_ON_CLOSE);
} private void initComponents() {
JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,
new JScrollPane(list1), new JScrollPane(list2)); list1.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
list1MouseClicked(e);
}
});
getContentPane().add(splitPane);
}// 这里是对于list1 list2得设定 /**
* 盘符的方向不对,不是"//",而是"\\"
*/
private void aaa() {// 显示文件与文件夹
File f = new File("c:\\");
File file;
String[] m_dir = f.list();
System.out.println(m_dir);
for (int i = 0; i < m_dir.length; i++) {
file = new File("c:\\" + m_dir[i]);
if (file.isDirectory()) {
list1.add(m_dir[i]);// list1是c盘下文件夹
} else {
list2.add(m_dir[i]);// //list2是c盘下文件
}
}
} private void list1MouseClicked(MouseEvent evt) { // 这是双击事件
File file; if (evt.getClickCount() == 2) { // 双击
System.out.println(list1.getSelectedItem());
File file1 = new File(list1.getSelectedItem());// 找到file1
System.out.println("n=" + file1.getParent());//
/**
* 你为何要去判断父目录呢?你看一下,父目录为空或不为空,你的操作有何区别?
*
* 且路径拼的不对。file的name只是文件名称。
*
* 你应该使用全路径,才能得到正确的文件对象 这是逻辑上的问题
*
* 例如,我的C盘下有一个bea目录,当双击的时候,也许可以正确地找到,但是再深入一层呢?我的bea下面有一个
*
* weblogic文件夹,全路径应该是c:\bea\weblogic。可是你这里却成了c:\weblogic。
*
* 这显然不对。运行时候抛出的空指针异常就是因为没有取到正确的路径,而读出的内容为空 String[] m_dir =
*
* file2.list();就是这句,得到null对象,你后面却直接加以使用。
*
* 若你想得到正确的,我建议你保存一份文件列表,来存储所有要显示的file对象。
*
* 刷新界面的时候根据这个列表添加要显示的内容,文件名称等。
*/ if (file1.getParent() == null || file1.getParent().isEmpty()) { // 如果file1得父目录为空则
File file2 = new File("c:\\" + list1.getSelectedItem());// file2的路径是c://所点击文件名
System.out.println(file2);
list1.removeAll();// 清空list1 以便出现子目录文件夹
list2.removeAll();// 晴空list2 以便出现子目录文件
String[] m_dir = file2.list();// 所有子目录下文件文件夹
for (int i = 0; i < m_dir.length; i++) {
file = new File(file2.toString() + "\\" + m_dir[i]);
if (file.isDirectory()) {
list1.add(m_dir[i]);// 文件夹添加到list1
System.out.println(m_dir[i]);
} else {
list2.add(m_dir[i]);// 文件添加到list2
} }
} else {// 父目录不是空
File file2 = new File(file1.getParent()
+ list1.getSelectedItem());// file2是父目录/所点击文件夹
System.out.println(file2.getPath());
list1.removeAll();// 清空list1 以便出现子目录文件夹
list2.removeAll();// 清空list2 以便出现子目录文件
String[] m_dir = file1.list();// 以下同上
for (int i = 0; i < m_dir.length; i++) {
file = new File(file2.toString() + "\\" + m_dir[i]);
if (file.isDirectory()) {
list1.add(m_dir[i]);
System.out.println(m_dir[i]);
} else {
list2.add(m_dir[i]);
} }
}
}
} public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() { public void run() {
new NewJFrame().setVisible(true);
}
});
}}
例如,我的C盘下有一个bea目录,当双击的时候,也许可以正确地找到,但是再深入一层呢?我的bea下面有一个
*
* weblogic文件夹,全路径应该是c:\bea\weblogic。可是你这里却成了c:\weblogic。
目前我也发现存在这个问题 就是不知道应该如何解决 你说做一个储存列表就是解决办法吧
这个解决列表需要什么方法呢
谢谢
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.File;
import java.util.ArrayList;import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;public class NewJFrame extends JFrame { /**
* 这两个东西一定要通过new关键字初始化出来, 不然会抛出java.lang.NullPointerException
*/
private List list1 = new List();
private List list2 = new List(); /*
* 这里用来存储你的list1中的所有信息,你需要的都可以来这里面找
*/
private java.util.List<File> currentParentList = new ArrayList<File>(); public NewJFrame() {
initComponents();
aaa(); setSize(600, 480);
setDefaultCloseOperation(EXIT_ON_CLOSE);
} private void initComponents() {
JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,
new JScrollPane(list1), new JScrollPane(list2)); list1.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
list1MouseClicked(e);
}
});
getContentPane().add(splitPane);
}// 这里是对于list1 list2得设定 /**
* 盘符的方向不对,不是"//",而是"\\"
*/
private void aaa() {// 显示文件与文件夹
File f = new File("c:\\"); /*
* 注意,file的list方法在这里并不合适。如果你只需要文件名的话,可以用,
*
* 但如果想得到更多信息
*
* 建议使用listFiles,返回下层的所有子目录和子文件
*/ refresh(f);
} /**
* 注意以下这个方法。由于所做的事情逻辑相同,我进行了一次抽取。封装成了一个单独的函数
*
* 两处调用。请注意整理一下自己的逻辑。
*
* 唉,看了你三个帖子了,第四个你是不是要问怎么返回上一级了呢……
*
* 顺便说了吧。选中的file找到后直接refresh(file.getParent());
* **/ private void refresh(File f) {
if (f == null || !f.exists()) {
return;
}
File[] files = f.listFiles();
for (int i = 0; i < files.length; i++) {
File file = files[i];
if (file.isHidden()) {
// 隐藏文件或文件夹过滤掉。你可以自己选择,增加或者减少显示的范围
continue;
} if (file.isDirectory()) {
currentParentList.add(file);
list1.add(file.getName());
} else {
list2.add(file.getName());
}
}
} private void list1MouseClicked(MouseEvent evt) { // 这是双击事件 if (evt.getClickCount() == 2) { // 双击
// 此处得到双击的行号
int index = list1.getSelectedIndex();
// 进行有效性验证 : 双击无效行号,不玩了
if (index < 0 || index >= currentParentList.size()) {
return;
} File f = currentParentList.get(index); currentParentList.clear();
list1.removeAll();
list2.removeAll();
refresh(f); }
} public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() { public void run() {
new NewJFrame().setVisible(true);
}
});
}}唉……要考虑:
你要展示什么数据?
从那里读取这些数据?
读取的和要显示的中间存在一定差异,如何整合?
整合的时候一定会需要缓存一些信息,这些信息缓存在哪里?mail给你的demo你收到了吗
这个是我自己的 我改的 但还没到达效果 好像还得做数组
基础差 好多东西都蒙 在会社学习 和两个专业同事一起研修 速度赶不上别人 他们都做好几年了 没活干才研修 和他们比 有点手忙脚乱的 public class NewJFrame extends javax.swing.JFrame { File root = new File("c:\\"); /** Creates new form NewJFrame */
public NewJFrame() throws Exception {
initComponents();
aaa();
/*showAllFiles(root);*/
} @SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() { list1 = new java.awt.List();
list2 = new java.awt.List();
list3 = new java.awt.List(); setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
setTitle("AAAA"); 。太长 这省了 pack();
}// </editor-fold> private void list1MouseClicked(java.awt.event.MouseEvent evt) {
File file;
if (evt.getClickCount() == 2) { //双击
System.out.println(list1.getSelectedItem());
File file1 = new File("c:\\" + list1.getSelectedItem());//找到file
String[] str = new String[10];//在这做出设定 就是要取得 c和list1.getSelectedItem()之间的路径这样就可以循环了
str[0] = list1.getSelectedItem();
File file2 = new File("c:\\" + str[0] + "\\"+ list1.getSelectedItem());
list1.removeAll();//清空list1 以便出现子目录文件夹
list2.removeAll();//晴空list2 以便出现子目录文件
String[] m_dir = file1.list();//所有子目录下文件文件夹
for (int i = 0; i < m_dir.length; i++) {
file = new File(file1.toString() + "\\" + m_dir[i]);
if (file.isDirectory()) {
list1.add(m_dir[i]);//文件夹添加到list1
System.out.println(m_dir[i]);
} else {
list2.add(m_dir[i]);//文件添加到list2
} }
}
} private void aaa() {//显示文件与文件夹
File f = new File("c:\\");
File file;
String[] m_dir = f.list();
for (int i = 0; i < m_dir.length; i++) {
file = new File("c:\\" + m_dir[i]);
if (file.isDirectory()) {
list1.add(m_dir[i]);//list1是c盘下文件夹 } else {
list2.add(m_dir[i]);////list2是c盘下文件
}
}
} private void showAllFiles(File dir) throws Exception {
File[] fs = dir.listFiles();
for (int i = 0; i < fs.length; i++) {
System.out.println(fs[i].getAbsolutePath());
list3.add(fs[i].getAbsolutePath());
if (fs[i].isDirectory()) {
try {
showAllFiles(fs[i]);
} catch (Exception e) {
}
}
}
}
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() { public void run() {
try {
new NewJFrame().setVisible(true);
} catch (Exception ex) {
}
}
});
} // Variables declaration - do not modify
private java.awt.List list1;
private java.awt.List list2;
private java.awt.List list3;
// End of variables declaration
}
String[] str = new String[10];//在这做出设定 就是要取得 c和list1.getSelectedItem()之间的路径这样就可以循环了
str[0] = list1.getSelectedItem();
File file2 = new File("c:\\" + str[0] + "\\"+ list1.getSelectedItem());
还是逻辑问题。我举个例子:
当前左边是
c:\。 假如 你双击得到了两个文件夹 A 和 B
然后呢,你的str[0] 内容就是 “c:\”然后你 new File("c:\\" + str[0] + "\\"+ list1.getSelectedItem());你看看你得到的路径是什么?
c:\c:\\c:\
这可不是一个合法的路径……按照你的思路来走,你一定要把完整的路径正确保存才行。仅仅玩文件名是不够的。且会很复杂。
所以我就想把路径给他摆正确了
例如c:/a/b/c/d/e路径是这样第一次取c:/a 第二次就是c:/b a没有了 但是a可以从上一次记忆中得到吧 反正就是错误中得到 嘿嘿 别的不会呀 就逮住一个错误就解决
我会好好研究的
这个明天中午前得完成 呵呵
就是得挺住学习
我身边的人都是日本人 沟通起来有点费劲
也不知道他们什么心理 就是有种说不出来的感觉 你的这段代码对我来说都完美去了
呵呵private java.util.List<File> currentParentList = new ArrayList<File>();
为什么偏偏这么写 一般不都这么些 我这么写了以后出现错位
这个就是一个虚拟的表格 装list1的?他依靠着refresh(f)更新 是吗?
private List<File> currentParentList = new ArrayList<File>();