将JList保存到Txt文件中

时间:2019-12-02 17:13:18

标签: java swing

在搜索了几个小时的答案后,我决定在这里询问,因为我发现的解决方案无效。

我有一个简单的GUI来注册一个人的名字/姓氏和出生日期。输入值之后,数据将列在JList中。现在,我想将JList中的数据保存到一个Txt文件中。但是我找不到从JList中获取数据的方法。

public void save(){
    try(BufferedWriter bw = new BufferedWriter(new FileWriter("jlist.txt")))
    {
        /* Here should be the part, where I get the data from the JList */

        bw.write(person.getNachname() + " ; " + person.getVorname() + " ; " + person.getDate() + "\n");
    } catch (Exception speichern) {
        speichern.printStackTrace();
    }
}

稍后,我要获取创建的Txt文件并将其重新加载到同一JList中。

也许有更好的方法可以做到这一点,但我还没有发现任何东西。

一些技巧会有所帮助:)

3 个答案:

答案 0 :(得分:2)

没有JList方法可以为您执行此操作。

您需要从ListModel获取数据。

您可以使用ListModel方法从JList获得getModel()

您需要编写一个循环至:

  1. 使用ListModel方法从getElementAt(...)获取每个元素。
  2. 将元素转换为字符串并将数据写入文件。
  

一些提示会有所帮助

与您的问题无关,但通常这样的数据将显示在JTable中。然后,每个名字,姓氏和日期都有单独的列。阅读How to Use Tables上Swing教程中的部分,以获取更多信息。

答案 1 :(得分:1)

正如camickr所指出的,对于您要存档的内容,没有实现任何方法,相反,您可以将目标存档的事情组合在一起。

您正面临数据持久性的问题。在当今的中小型工业应用中,推荐的方法是在数据库上进行中继。我想这已经超出了一个开始编写代码的人的范围,因此使用文件存储信息是可以的,但并不直接。

在您的情况下,如果您的应用程序用于非商业目的,我建议使用默认机制对平台捆绑的对象进行序列化和反序列化。这样,您可以将整个对象(包括其数据,又称其 state )写入磁盘上的文件,然后用很少的行代码检索它。有关对象如何获得的详细信息,目前尚无法实现 serialize (“将对象转换为位”)和 deserialized (“将位转换为对象”) ,但是如果您打算在商业应用中使用此方法,建议您以后再进行研究。

因此,我建议您分别在启动和关闭时加载和存储应用程序的信息,因此,当应用程序处于活动状态时,每个应用程序实例仅加载和存储一个应用程序,并将数据存储在内存中。这是您在任何应用程序中可能拥有的最简单的方法,因此,我建议从理想的情况开始。

所以,我说了很多话,但让我们看一下显示存储(序列化)和加载(反序列化)示例的代码

import java.io.*;
import java.util.*;

class Person implements Serializable {
  String name;
  int birthDate;

  public Person(String name, int birthDate) {
    this.name = name;
    this.birthDate = birthDate;
  }
}

class Main {
  public static void main(String[] args) {
     Collection<Person> collection = createExampleCollection();
     System.out.println(collection);
     storeCollection(collection, "persons.data");
     Collection<Person> otherCollection = loadCollection("persons.data");
     System.out.println(otherCollection);
  }

  private static Collection<Person> createExampleCollection()  {
        Collection<Person> collection = new ArrayList<Person>();

        collection.add(new Person("p1",0));
        collection.add(new Person("p2",10));
        collection.add(new Person("p2",20));
        return collection;
  }


  // here i'm doing two separated things that could gone in separate functions, 1) i'm converting into bytes and object of an specific class, 2) saving those bytes into a file on the disk. The thing is that the platform offers us convenient objects to do this work easely
  private static void storeCollection(Collection<Person> collection, String filename) {
     try {
         FileOutputStream fos = new FileOutputStream(filename); 
         ObjectOutputStream out = new ObjectOutputStream(fos);
         out.writeObject(collection);
         out.close();
         fos.close();
      } catch (IOException i) {
         i.printStackTrace();
      }
  }

  // again there two things going on inside, 1) loading bytes from disk 2) converting those bits into a object of a specific class.
  private static Collection<Person> loadCollection(String filename) {
      try {
         FileInputStream fis = new FileInputStream(filename);
         ObjectInputStream in = new ObjectInputStream(fis);
         Collection<Person> persons = (Collection<Person>) in.readObject();
         in.close();
         fis.close();
         return persons;
      } catch (Exception i) {
         i.printStackTrace();
         return null;
      }

  }
}

您应该尝试分别在启动和关闭时使用loadCollection和storeCollection的功能。

希望这至少对您有帮助!

答案 2 :(得分:1)

我用jFrame中的jButton和jList注释了这段代码,Button将文本项从jList保存到文件中。

def query():
    top1 = Toplevel() # creates new window called top1
    print_records = ''
    for record in records: #to show the records
        print_records += str(record[0]) +"\t" + str(record[8])+ "\n"
    query_label = Label(top1, text=print_records) # now the query_label is assigned to top1
    query_label.grid(row=14, column=0, columnspan=2)