2016-04-08 10 views
0

私は、ビデオストア内のレコードを管理するためのインターフェイスであるはずのnetbeansを使用してGUIプログラムを作成しています。ファイルからjTableにレコードをロードする方法は?

enter image description here enter image description here

これはインターフェイスです。これは2つのタブで、一方はレコードを追加し、もう一方のタブはレコードを追加することができます。人がレコードを追加すると、その名前はoutputという名前の.datファイルに追加されます。 .datファイルをビデオ・レコードの永続的な記憶領域として使用したいと思います。基本的には、GUIクラスをロードすると、.datファイルからすべてのレコードがロードされます。コードを作成しましたが、次のエラーが表示されます。

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) 

次に、関連するすべてのコードを貼り付けます。名前のGUIクラスのmainメソッドで

VideoStoreの.java: VideoStoreコンストラクタクラスの

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

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

そして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(); 
     } 

そして最後に、私のビデオクラス:

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; 
} 
...そして、クラス内の各変数のミューテータとアクセサメソッド...
@Override 
public String toString(){ 
    return videoName + "\t" + producer + 
      "\t" + rating + "\t" + genre + 
      "\t" + videoNumber + "\t" + videoPrice; 
} 

だからええ、私の問題があることですファイルからテーブルにレコードをロードする方法を理解できません。私のコードでは、レコードのサイズに基づいてファイル内の各レコードを繰り返し処理するループを使用しようとしましたが、うまく動作していないようです。誰かが私のフルコードを見たい、またはもっと情報が必要な場合は、私に連絡することを躊躇しないでください:)

+0

は)(BinaryFile.java – SpringLearner

+0

連結+ = raf.readCharに私たちの行番号82を示し; @SpringLearner –

+1

すぐに役立つようにするには、[MCVE]または[ショート、自己完結型、正しい例](http://www.sscce.org/)を投稿してください。 –

答えて

1

まず、よりオブジェクト指向のアプローチを使用する必要があります。

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 

} 

Object-Oriented Programming Conceptsを確認してください:

あなたのビデオクラスは、それはこのようになります必要がある場合、何もなく、静的属性が含まれていません。

新しいビデオを追加するには、グラフィックインターフェイスからユーザー入力を受け取り、それを使用してVideoオブジェクトを作成します。

Video video = new Video(); 

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

次に、すべての動画をListに保存できます。

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

videoList.add(video); 

次に、serializeをファイルに追加できます。

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

     out.writeObject(videoList); 

} catch (IOException e1) { 

     // Handle the exception 

} 

ファイルからあなたのリストをリードバックするには、あなたがそれをデシリアライズする必要があります。

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

あなたの助けに感謝します!しかし、私はこれが私の質問に答えるかどうかはわかりません...プログラムを再起動すると、ファイルをjTableに戻す方法を教えてください。 –

+0

@ハナレイ:ファイルの書き方によって異なります。 Jefferson Limaの指示に従っている場合は、そのファイルを読んで逆シリアル化します。 –

+0

@GilbertLeBlanc大丈夫です。しかし、すべてのオブジェクトを1つのファイルにシリアライズすれば、それを非直列化してテーブルに戻すことは非常に難しいでしょうか?コンパイラはどのようにして異なるオブジェクトを区別するのか知っていますか? –

関連する問題