Java正确使用ArrayList

时间:2017-02-15 00:42:48

标签: java arrays swing arraylist jlist

我目前正在开发一个小项目,其中Jframe有一个Jlist,它显示一个文件的arraylist,它是通过扫描目录收集的。

整个过程就像这样,一个单独的类,在Jframe类中调用一个名为" main"的方法。这个"主要"方法扫描目录(folderAndFiles)并将所有文件名列入常规文本文件(file.txt)。然后单独的类显示Jframe,然后有另一个扫描程序,它读取新文本文件(file.txt)并将该文件中的所有名称转换为arraylist(filList)。在Jframe的初始化函数中,我然后设置DefaultListModel以将arraylist项添加到Jlist。

一切都有效,但有一些轻微的打嗝。第一件事是Jlist显示arraylist中的东西,这意味着它将像[File1.txt, File2.txt, File3.txt, etc...],而不是垂直,文件名显示在彼此之下。然后是第二个问题,如果第一个问题得到解决,可能会修复,数组列表太长,在列出一些文件之后在Jlist上最后说"行是长的,请切换到包装模式看整行..."

我不确定我是否正在使用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");

}

以下是我从单独的类

调用Jframe和函数的方法
public static void main(String[] args) throws IOException {
    try {
        DisplayTest.main();
    } finally {
        DisplayTest dTest = new DisplayTest();
        dTest.setVisible(true);
    }
}

1 个答案:

答案 0 :(得分:3)

  

我不完全确定我是否正在使用arraylist

JList不知道如何在ArrayList中显示项目,因此您无法将ArrayList添加到ListModel

因此,您需要遍历ArrayList并将每个项目添加到ListModel

或者更简单,只需摆脱ArrayList并将文件中的数据直接读入ListModel

您的代码结构不合理。每当您看到过度使用静态变量和方法时,您就会知道存在设计问题。

我首先阅读How to Use Lists上的Swing教程中的部分。那里有一些工作示例可以向您展示更好的程序结构。您可以从工作代码开始,并根据您的要求进行修改。