Java正确使用ArrayList
Java proper use of ArrayList
我目前正在做一个小项目,其中一个 Jframe 有一个 Jlist,它显示文件的数组列表,这些文件是通过扫描目录收集的。
整个过程是这样的,一个单独的 class,调用 Jframe class 中的一个方法 "main"。此 "main" 方法扫描目录 (folderAndFiles) 并将所有文件名列在一个常规文本文件 (file.txt) 中。然后单独的 class 显示 Jframe,然后有另一个扫描器,它读取新的文本文件 (file.txt) 并将该文件中的所有名称转换为数组列表 (filList)。在 Jframe 的初始化函数中,我然后设置一个 DefaultListModel 以将 arraylist 项添加到 Jlist。
一切正常,但有一些小问题。第一件事是 Jlist 水平显示 arraylist 中的内容,这意味着它将像这样 [File1.txt, File2.txt, File3.txt, etc...]
而不是垂直显示,文件名显示在彼此下方。然后是第二个问题,如果第一个问题得到解决可能会得到解决,数组列表太长并且在列出一些文件后在 Jlist 上最终显示 "line is to long, please switch to wrapped mode to see whole line..."
我不完全确定我是否正确使用 arraylist 以及为什么它不能垂直且正确地列出 Jlist 中的项目。
下面是整个Jframe,Jlist放在这里,功能就发生了
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Scanner;
import javax.swing.DefaultListModel;
public class DisplayTest extends javax.swing.JFrame {
static String username = System.getProperty("user.name");
static File file = new File("file.txt");
static ArrayList<String> filList = new ArrayList<String>();
public DisplayTest(){
initComponents();
DefaultListModel DLM = new DefaultListModel();
DLM.addElement(filList);
jList1.setModel(DLM);
System.out.println(filList);
}
public static void main(String args[]) {
/* Create and display the form */
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new DisplayTest().setVisible(true);
}
});
}
// Variables declaration - do not modify
private javax.swing.JLabel jLabel1;
private javax.swing.JList<String> jList1;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JScrollPane jScrollPane2;
private javax.swing.JTextArea jTextArea1;
// End of variables declaration
public static void main() throws IOException {
try {
listFilesForFolderMac(folderAndFiles);
} finally {
Scanner scanner = new Scanner(file);
while (scanner.hasNextLine()) {
String line = scanner.nextLine();
filList.add(line);
}
}
public static void listFilesForFolderMac(final File folder) throws IOException {
PrintWriter writToDoc = new PrintWriter(new FileWriter("file.txt",true));
for (final File fileEntry : folder.listFiles()) {
if (fileEntry.isDirectory()) {
listFilesForFolderMac(fileEntry);
} else {
writToDoc.println(fileEntry.getName());
}
}
writToDoc.close();
}
final static File folderAndFiles = new File("/Users/" + username + "/Documents");
}
以下是我如何从单独的 class
调用 Jframe 和函数
public static void main(String[] args) throws IOException {
try {
DisplayTest.main();
} finally {
DisplayTest dTest = new DisplayTest();
dTest.setVisible(true);
}
}
I am not completely sure whether I am using the arraylist right
A JList
不知道如何显示 ArrayList
中的项目,因此您不能只将 ArrayList
添加到 ListModel
。
因此您需要遍历 ArrayList
并将每个项目添加到 ListModel
。
或者更简单,只需去掉 ArrayList
并将文件中的数据直接读入 ListModel
。
您的代码结构不佳。每当您看到过度使用静态变量和方法时,您就知道您遇到了设计问题。
我会先阅读 How to Use Lists 上的 Swing 教程中的部分。那里有工作示例,可以向您展示更好的程序结构。您可以从工作代码开始,然后根据您的要求对其进行修改。
我目前正在做一个小项目,其中一个 Jframe 有一个 Jlist,它显示文件的数组列表,这些文件是通过扫描目录收集的。
整个过程是这样的,一个单独的 class,调用 Jframe class 中的一个方法 "main"。此 "main" 方法扫描目录 (folderAndFiles) 并将所有文件名列在一个常规文本文件 (file.txt) 中。然后单独的 class 显示 Jframe,然后有另一个扫描器,它读取新的文本文件 (file.txt) 并将该文件中的所有名称转换为数组列表 (filList)。在 Jframe 的初始化函数中,我然后设置一个 DefaultListModel 以将 arraylist 项添加到 Jlist。
一切正常,但有一些小问题。第一件事是 Jlist 水平显示 arraylist 中的内容,这意味着它将像这样 [File1.txt, File2.txt, File3.txt, etc...]
而不是垂直显示,文件名显示在彼此下方。然后是第二个问题,如果第一个问题得到解决可能会得到解决,数组列表太长并且在列出一些文件后在 Jlist 上最终显示 "line is to long, please switch to wrapped mode to see whole line..."
我不完全确定我是否正确使用 arraylist 以及为什么它不能垂直且正确地列出 Jlist 中的项目。
下面是整个Jframe,Jlist放在这里,功能就发生了
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Scanner;
import javax.swing.DefaultListModel;
public class DisplayTest extends javax.swing.JFrame {
static String username = System.getProperty("user.name");
static File file = new File("file.txt");
static ArrayList<String> filList = new ArrayList<String>();
public DisplayTest(){
initComponents();
DefaultListModel DLM = new DefaultListModel();
DLM.addElement(filList);
jList1.setModel(DLM);
System.out.println(filList);
}
public static void main(String args[]) {
/* Create and display the form */
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new DisplayTest().setVisible(true);
}
});
}
// Variables declaration - do not modify
private javax.swing.JLabel jLabel1;
private javax.swing.JList<String> jList1;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JScrollPane jScrollPane2;
private javax.swing.JTextArea jTextArea1;
// End of variables declaration
public static void main() throws IOException {
try {
listFilesForFolderMac(folderAndFiles);
} finally {
Scanner scanner = new Scanner(file);
while (scanner.hasNextLine()) {
String line = scanner.nextLine();
filList.add(line);
}
}
public static void listFilesForFolderMac(final File folder) throws IOException {
PrintWriter writToDoc = new PrintWriter(new FileWriter("file.txt",true));
for (final File fileEntry : folder.listFiles()) {
if (fileEntry.isDirectory()) {
listFilesForFolderMac(fileEntry);
} else {
writToDoc.println(fileEntry.getName());
}
}
writToDoc.close();
}
final static File folderAndFiles = new File("/Users/" + username + "/Documents");
}
以下是我如何从单独的 class
调用 Jframe 和函数public static void main(String[] args) throws IOException {
try {
DisplayTest.main();
} finally {
DisplayTest dTest = new DisplayTest();
dTest.setVisible(true);
}
}
I am not completely sure whether I am using the arraylist right
A JList
不知道如何显示 ArrayList
中的项目,因此您不能只将 ArrayList
添加到 ListModel
。
因此您需要遍历 ArrayList
并将每个项目添加到 ListModel
。
或者更简单,只需去掉 ArrayList
并将文件中的数据直接读入 ListModel
。
您的代码结构不佳。每当您看到过度使用静态变量和方法时,您就知道您遇到了设计问题。
我会先阅读 How to Use Lists 上的 Swing 教程中的部分。那里有工作示例,可以向您展示更好的程序结构。您可以从工作代码开始,然后根据您的要求对其进行修改。