0
votes

Enregistrer JList dans un fichier Txt

Après avoir cherché une réponse pendant des heures, j'ai décidé de la poser ici, car les solutions que j'ai trouvées ne fonctionnaient pas.

J'ai une interface graphique simple pour enregistrer le prénom / nom et la date de naissance d'une personne. Après avoir entré les valeurs, les données sont répertoriées dans une JList. Maintenant, je veux enregistrer les données de la JList dans un fichier Txt. Mais je ne trouve pas de moyen d'obtenir les données de la 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();
    }
}

Plus tard, je veux prendre le fichier Txt créé et le recharger dans la même JList.

Il y a peut-être même une meilleure façon de faire cela, mais je n'ai rien trouvé.

Quelques conseils seraient utiles :)


0 commentaires

3 Réponses :


2
votes

Il n'y a pas de méthode JList qui fait cela pour vous.

Vous devez obtenir les données du ListModel .

Vous obtenez le ListModel de la JList utilisant la méthode getModel() .

Vous devez écrire une boucle dans:

  1. récupérez chaque élément du ListModel à l'aide de la méthode getElementAt(...) .
  2. convertissez l'élément en chaîne et écrivez les données dans votre fichier.

Quelques conseils seraient utiles

Pas lié à votre question, mais généralement des données comme celle-ci sont affichées dans un JTable. Ensuite, vous avez une colonne distincte pour chacun des prénom, nom et date. Lisez la section du didacticiel Swing sur l' utilisation des tableaux pour plus d'informations.


2 commentaires

Oh désolé je me suis trompé. Ce n'est pas une JList, c'est une JTable. Mais merci pour les conseils!


Pour un JTable, vous avez toujours besoin de la boucle, mais vous pouvez utiliser la getValueAt(...) pour obtenir les données de chaque colonne et ligne.



1
votes

Comme le souligne camickr, aucune méthode n'est mise en œuvre pour ce que vous essayez de réaliser, mais il existe une combinaison de choses que vous pouvez faire pour archiver votre objectif.

Vous êtes confronté au problème de la persistance des données . De nos jours, pour les applications industrielles de petite | moyenne | grande taille, l'approche recommandée est de s'appuyer sur des bases de données. Je suppose que c'est hors de portée pour une personne qui commence à coder, donc utiliser des fichiers pour stocker des informations est acceptable mais n'est pas simple.

Dans votre cas, si votre application est à des fins non commerciales, je suggérerais d'utiliser le mécanisme par défaut pour la sérialisation et la désérialisation des objets fourni avec la plate-forme. Avec cela, vous pouvez écrire un objet entier (y compris ses données, alias son état ) dans un fichier sur un disque, et le récupérer plus tard avec quelques codes de lignes. Il y a des détails sur la façon dont l'objet est sérialisé ("traduire l'objet en bits") et désérialisé ("traduire les bits en objet") qui ne se met pas en place pour le moment, mais il est conseillé de les étudier à l'avenir si vous envisage d'utiliser cette méthode dans une application commerciale.

Je vous suggère donc de charger et de stocker les informations de votre application respectivement au démarrage et à l'arrêt, donc un seul chargement et stockage par instance d'application, pendant que l'application est active, fonctionne avec les données en mémoire. C'est l'approche la plus simple que vous puissiez avoir dans n'importe quelle application, et pour cette raison, je suggère de commencer par ce scénario idéal.

Donc, je dis beaucoup de choses mais passons au code qui montre un exemple de stockage (sérialisation) et de chargement (désérialisation)

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 easily
  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;
      }

  }
}

Vous devriez essayer d'utiliser les fonctions de loadCollection et storeCollection respectivement au démarrage et à l'arrêt.


1 commentaires

Salut Victor. Veuillez ne pas ajouter «j'espère que cela vous aidera» ou des variantes similaires. C'est plutôt redondant, car personne ne fournit une assistance volontaire en espérant qu'elle n'aide pas. Les lecteurs préfèrent généralement la rédaction technique ici.



1
votes

J'ai créé ce code avec des commentaires pour jButton et jList dans jFrame, Button enregistre les éléments de texte dans un fichier à partir de jList.

private void btnSaveActionPerformed(java.awt.event.ActionEvent evt) { //jButton name: "btnSave"                                      
    try {                                                                   //trying to save file
        BufferedWriter bw = new BufferedWriter(new FileWriter("data.txt")); //file where I store the data of jList1    (file will be stored at: C:\Users\%username%\Documents\NetBeansProjects\<ThisProjectName>\data.txt) (if You use NetBeans)
        for (int i=0; i<jList1.getModel().getSize(); i++){                  //opens a cycle to automatically store data of all items            
        bw.write(jList1.getModel().getElementAt(i));                        //writing a line from jList1             
        bw.newLine();                                                       //making a new line for the next item (by removing this line, You will write only one line of all items in file)
        }                                                                   //cycle closes
        bw.close();                                                         //file writing closes
    } catch (IOException ex) {                                              //catching the error when file is not saved
        Logger.getLogger(NewJFrame.class.getName()).log(Level.SEVERE, null, ex); //showing the error
    }                                                                       //Exception closes        
}                                                                           //Action closes


0 commentaires