2016-04-08 6 views
0

Je suis en train de créer un programme d'interface graphique, en utilisant netbeans, qui est censé être une interface pour gérer les enregistrements dans un magasin vidéo.Comment charger des enregistrements dans une jTable à partir d'un fichier?

enter image description here enter image description here

Ceci est l'interface. Il s'agit de deux onglets, et un côté permet à une personne d'ajouter des enregistrements, tandis que l'autre onglet les affiche. Lorsqu'une personne ajoute des enregistrements, ils sont ajoutés à un fichier .dat nommé output. Je voudrais utiliser le fichier .dat comme une zone de stockage permanente pour les enregistrements vidéo, et fondamentalement ce que je veux arriver est que quand on charge la classe GUI, le programme charge tous les enregistrements du fichier .dat. J'ai déjà créé mon code, mais j'obtiens l'erreur suivante:

run: 
java.io.EOFException 
    at java.io.RandomAccessFile.readChar(RandomAccessFile.java:773) 
    at videostore.BinaryFile.getString(BinaryFile.java:82) 
    at videostore.BinaryFile.load(BinaryFile.java:116) 
    at videostore.VideoStore.main(VideoStore.java:409) 
Exception in thread "main" java.lang.NullPointerException 
    at videostore.VideoStore.main(VideoStore.java:420) 
/Users/(my Name)/Library/Caches/NetBeans/8.1/executor-snippets/run.xml:53: Java returned: 1 
BUILD FAILED (total time: 2 seconds) 

Ensuite, je vais coller tout le code pertinent ci-dessous.

Dans la principale méthode de la classe GUI, nommée VideoStore .java:

file = new BinaryFile("/Users/hanaezz/Desktop/output.dat"); 
     int length = file.length(); 
     int ID = 1; 

     for (int xx = 0; xx < length; xx += file.getRecordLength()) { 
      Video load = file.load(xx); 
      String tempName = load.getVideoName(); 
      String tempProd = load.getProducer(); 
      String tempRat = load.getRating(); 
      String tempGenre = load.getGenre(); 
      short tempNum = load.getVidNum(); 
      float tempPrice = load.getvideoPrice(); 

      Object[] row = {ID, tempName, tempProd, tempGenre, tempRat, tempNum, tempPrice}; 


      model.addRow(row); 

      ID++; 
     } 

dans le VideoStore classe constructeur:

public VideoStore() { 
     initComponents(); 
     model = (DefaultTableModel) displayVideos.getModel(); 
    } 

Et dans la classe BinaryFile:

private static final int RecordLength = 112; 
public static Video load(int place){ 
     String name = "", prod="", rat="", genre=""; 

     float price = 1; 
     short number = 1; 
     try { 
      raf.seek(place); 
      name = getString(20); 
      prod = getString(15); 
      rat = getString(20); 
      genre = getString(10); 
      price = Float.parseFloat(getString(4)); 
      number = Short.parseShort(getString(4)); 

      writeString(20, name); 
      writeString(15, prod); 
      writeString(10, genre); 
      writeString(4, VideoStore.vPrice.getText()); 
      writeString(4, VideoStore.vNumber.getText()); 
      writeString(4, rat); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     Video r = new Video(name, prod, genre, rat, number, price); 
     return r; 
    } 

    public static int getRecordLength() throws IOException{ 
     return RecordLength; 
    } 

    public static int length() throws IOException { 
     return (int)raf.length(); 
     } 

Et enfin, mon Video Classe:

private static String videoName; 
    private static String producer; 
    private static String rating; 
    private static String genre; 
    private static short videoNumber; 
    private static float videoPrice; 

public Video(String a, String b, String c, String d, short e, float f){ 
    videoName = a; 
    producer = b; 
    rating = c; 
    genre = d; 
    videoNumber = e; 
    videoPrice = f; 
} 

... Puis méthodes mutator et accesseurs pour chaque variable dans la classe ...

@Override 
public String toString(){ 
    return videoName + "\t" + producer + 
      "\t" + rating + "\t" + genre + 
      "\t" + videoNumber + "\t" + videoPrice; 
} 

Alors oui, mon problème est que Je n'arrive pas à comprendre comment charger les enregistrements du fichier dans la table. Dans mon code, j'ai essayé d'utiliser une boucle qui parcourrait chaque enregistrement du fichier en fonction de la taille de l'enregistrement. Cependant, cela ne semble pas avoir fonctionné. Si quelqu'un souhaite voir mon code complet ou a besoin de plus d'informations, n'hésitez pas à me contacter :)

+0

nous montrent le numéro de la ligne 82 dans BinaryFile.java – SpringLearner

+0

concat + = raf.readChar(); @SpringLearner –

+1

Pour une meilleure aide plus rapidement, postez un [MCVE] ou [Short, Self Contained, Example correct] (http://www.sscce.org/). –

Répondre

1

D'abord, vous devriez utiliser une approche plus orientée objet.

Votre classe vidéo ne contient que les attributs statiques, quand il devrait ressembler à ceci:

public class Video implements Serializable{ 

    private String name; 
    private String producer; //consider using an object for this 
    private String rating; //consider using a numeric type for this 
    private String genre; //consider using an object for this 
    private int number; 
    private double price; 


    //getters and setters 

} 

Vérifiez la Object-Oriented Programming Concepts.

Pour ajouter une nouvelle vidéo, vous obtenez l'entrée de l'utilisateur à partir de l'interface graphique et vous l'utilisez pour créer un objet vidéo.

Video video = new Video(); 

video.setName(nameTextField.getText()); 
//same for the other attributes 

Ensuite, vous pouvez conserver toutes vos vidéos dans un List.

List<Video> videosList = new ArrayList<>(); 

videoList.add(video); 

Ensuite, vous pouvez serialize votre liste dans un fichier.

try(FileOutputStream outputFile = new FileOutputStream("/path/to/file"); 
    ObjectOutputStream out = new ObjectOutputStream(outputFile)){ 

     out.writeObject(videoList); 

} catch (IOException e1) { 

     // Handle the exception 

} 

Pour relire votre liste à partir du fichier, vous devez désérialiser:

try(FileInputStream inputFile = new FileInputStream("/path/to/file"); 
    ObjectInputStream in = new ObjectInputStream(inputFile)){ 

     videoList = (List<Video>)in.readObject(); 

} catch (IOException e1) { 

     // Handle the exception 

} 
+0

j'apprécie votre aide! Cependant, je ne suis pas sûr que cela répond à ma question ... comment puis-je charger le fichier dans la jTable une fois que je redémarre le programme? –

+0

@Hanalei: Cela dépend de la façon dont vous avez écrit le fichier. Si vous suivez les instructions de Jefferson Lima, vous lisez le fichier et le désérialisez. –

+0

@GilbertLeBlanc okay .. mais si je sérialise tous les objets dans un fichier, alors cela ne me rendra-t-il pas très difficile de le dé-sérialiser et de le renvoyer dans la table? comme le compilateur saura-t-il différencier les différents objets? –