Java ArrayList的正确使用

标签 java arrays swing arraylist jlist

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

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

一切正常,但有一些小问题。首先,Jlist 水平显示 arraylist 中的内容,这意味着它将像这样 [File1.txt、File2.txt、File3.txt 等...] 而不是垂直显示,其中文件名显示在彼此下方。然后是第二个问题,如果第一个问题得到解决,这个问题可能会得到解决,数组列表太长,在列出一些文件后,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);
    }
}

最佳答案

I am not completely sure whether I am using the arraylist right

JList 不知道如何显示 ArrayList 中的项目,因此您不能仅将 ArrayList 添加到ListModel

因此,您需要迭代 ArrayList 并将每个项目添加到 ListModel 中。

或者更简单,只需摆脱 ArrayList 并将文件中的数据直接读取到 ListModel 即可。

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

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

关于Java ArrayList的正确使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42238862/

相关文章:

java - 如何在 Java 中查找 double 'n' 的多少次方才能得到 double 'n'。 Python 中 Math.log 的等效项

java - 未检测到同时按下多个按钮

java - 如果套接字必须已经绑定(bind)到它,为什么 DatagramSocketImpl joinGroup 方法需要一个 NetworkInterface?

c - 从 stdin 读取输入到指针数组中直到 EOF,但没有任何输出?

java - 如何检测大写锁定是否在 Swing 中切换?

Java GUI Windows 根本不出现

java - 在Android游戏中翻转 Sprite 图像

javascript - 使用 Array.prototype.map(callback, index) 在模板文字中索引 [data-attribute]?

c 字符串在超出边界时仍然有效?

java - 使用选项 Pane GUI 替换框架中的内容