Я делаю программу, которая будет генерировать текстовый файл, содержащий дерево каталогов. Я выполнил часть обхода файлов, поэтому у меня готов текстовый файл. Затем я хочу использовать этот текстовый файл, прочитать его и преобразовать данные в JTree. Я застрял с алгоритмом в течение 2 дней!! У кого-нибудь есть предложения? плиз помогите.
* обратите внимание, что я использовал "\t"
для интервала.
Некоторая часть моего path.txt
путь.txt
Arcana Advanced
ABC
ABC
AcnMiniGame
client
Data
error
patch
patch_03451
patch_03452
patch_03453
patch_03454
patch_03455
patch_03456
patch_03458
SaveDeck
ModifiedDeck1 Earth Water
ModifiedDeck2 Wind Fire
ModifiedDeck3 Wind Earth
ModifiedDeck4 Earth Fire
ModifiedDeck5 Wind Water
ModifiedDeck6 Fire Water
Starter1 Earth Water
Starter2 Fire Wind
Starter3 Earth Wind
Starter4 Earth Fire
Starter5 Water Wind
Starter6 Water Fire
Tutorial
unicows
unins000
unins000
ASActiveX
Au_activeX
ThaiGameStart
nProtect
npkcx
npkagt
npkcrypt
npkcrypt
npkcrypt
npkcsvc
npkcusb
npkcx
npkcx
npkpdb
npkuninst
Это то, что я пробовал до сих пор:
public final class FileTree extends JPanel {
JTree tree;
DefaultMutableTreeNode root;
Path path;
List<String> lines;
public FileTree(String filepath) {
try {
root = new DefaultMutableTreeNode("root", true);
this.path = Paths.get(filepath);
lines = Files.readAllLines(path);
getList(root, 0);
setLayout(new BorderLayout());
tree = new JTree(root);
tree.setRootVisible(false);
add(new JScrollPane((JTree) tree), "Center");
} catch (IOException ex) {
Logger.getLogger(FileTree.class.getName()).log(Level.SEVERE, null, ex);
}
}
public int getTab(int line) {
String text = lines.get(line);
return text.lastIndexOf("\t");
}
public boolean noChild(int line) {
if (getTab(line) < getTab(line + 1)) {
return false;
}
return true;
}
public int getLastLine(int line) {
int myTab = getTab(line);
int myLine = line+1;
int i = line+1;
while (true) {
if (myTab == getTab(myLine)) {
return i;
} else {
myLine++;
i++;
}
}
}
public int getChildList(int line) {
int i = 0;
int ChildTab = getTab(line + 1);
int myLine = line + 1;
while (true) {
if (ChildTab == getTab(myLine)) {
myLine++;
i++;
} else if (ChildTab < getTab(myLine)) {
myLine++;
} else if (ChildTab > getTab(myLine)) {
return i;
}
}
}
public void getList(DefaultMutableTreeNode node, int line) {
try {
if (noChild(line)) {
System.out.println("FILE - " + lines.get(line));
DefaultMutableTreeNode child = new DefaultMutableTreeNode(lines.get(line).trim());
node.add(child);
} else {
System.out.println("DIRECTORY - " + lines.get(line));
DefaultMutableTreeNode child = new DefaultMutableTreeNode(lines.get(line).trim());
node.add(child);
int ChildList = getChildList(line);
for (int i = 0; i < ChildList; i++) {
getList(child, line + i + 1);
}
}
} catch (Exception e) {
}
}
}
результат: http://www.uppic.org/image-5E7B_55C470B7.jpg
Моя проблема с кодом, похоже, заключается в том, что после того, как он закончил изучение папки, фактическая строка не знает об этом и продолжает читать следующую строку, которая является файлом в исследуемой папке. (Это сложно объяснить словами, извините за мой плохой английский)
И вторая проблема заключается в том, что она не читает все основные папки, как вы можете видеть на картинке, программа перестает работать после изучения папки «Arcana Advanced». Я понимаю причину этой проблемы, поэтому я попытался использовать другой метод, чтобы проверить, сколько у них основных папок, и выполнить цикл for. Но это очень грязно и отнимает много времени, у кого-нибудь есть более простой способ сделать это?