在搜索了几个小时的答案后,我决定在这里询问,因为我发现的解决方案无效。
我有一个简单的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中。
也许有更好的方法可以做到这一点,但我还没有发现任何东西。
一些技巧会有所帮助:)
答案 0 :(得分:2)
没有JList方法可以为您执行此操作。
您需要从ListModel
获取数据。
您可以使用ListModel
方法从JList
获得getModel()
。
您需要编写一个循环至:
ListModel
方法从getElementAt(...)
获取每个元素。一些提示会有所帮助
与您的问题无关,但通常这样的数据将显示在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)