3

この問題についてはすでにいくつかの問題を調べましたが、私の問題を解決できませんでした。

以下に示すように、シリアライゼーションによって、my Patient ArrayList( pList- クラスの一番上にあるプライベート) のすべてのオブジェクトを「Patient.ser」ファイルに保存します。私が知る限り、これは問題なく動作しています。「patSizeAtSave」は、ファイルをロードするときに使用する境界としてマークするために使用しているプラ​​イベート変数です(以下を参照)

patModel」は私DefaultListModelが使用するものなので、それらのリストに追加されたものを入力しようとしますJListsGUIPatient ArrayList(pList)

私の問題:ロードボタンを押すと、以下GUIのメソッドが呼び出されますが、 JListsloadPatientList()に何も入れられていないため、まったく機能するかどうかわかりません。

これを修正する方法について何か考えはありますか?

private void savePatientList() throws FileNotFoundException {
    try
    {
    FileOutputStream fs = new FileOutputStream("Patient.ser");
    ObjectOutputStream os = new ObjectOutputStream(fs);
    for(Patient p: pList)
    {
        os.writeObject(p);
    }
    fs.close();
    os.close();
    patSizeAtSave = pList.size();
    JOptionPane.showMessageDialog(jTabPane, "Save Complete!", "Notification", JOptionPane.INFORMATION_MESSAGE);
    } 
    catch (IOException ex) {
        Logger.getLogger(MainFrame.class.getName()).log(Level.SEVERE, null, ex);
    } 

}
private void loadPatientList()
{
    FileInputStream fs;
    ObjectInputStream is;
    try
    {
    fs = new FileInputStream("Patient.ser");
    is = new ObjectInputStream(fs);

    for(int i = 0; i < patSizeAtSave; i++)
    {
        Patient p = (Patient) is.readObject();
        pList.add(p);
        patModel.addElement(p.getPNo() + ": " + p.getPName());
    }
    jListPatient.setModel(patModel);
    jListPatient2.setModel(patModel);
    fs.close();
    is.close();
    } 
    catch (FileNotFoundException ex) {
        Logger.getLogger(MainFrame.class.getName()).log(Level.SEVERE, null, ex);
    } catch (IOException | ClassNotFoundException ex) {
        Logger.getLogger(MainFrame.class.getName()).log(Level.SEVERE, null, ex);
    }
}
4

1 に答える 1

4

患者リストを保存した後、(JVM を終了せずに) 同じ JVM にロードしようとしましたか? 患者リストをリロードする前に JVM を終了すると、patSizeAtSave は 0 にリセットされ (ファイル/永続ストレージには保存されないため)、メモリ内にのみリセットされます。新しい JVM で loadPatientList を呼び出す場合、patSizeAtSave が 0 であるため、for ループは患者をロードしません。

次のように、リスト pList 全体を保存する必要があります (ArrayList / LinkedList などのリストのシリアライズ可能な実装を使用すると仮定します)。

FileOutputStream fs = new FileOutputStream("Patient.ser");
ObjectOutputStream os = new ObjectOutputStream(fs);
os.writeObject(pList);

そして、それをロードして戻します:

pList = (List<Patient>) is.readObject();
for(Patient p: pList)
{
    patModel.addElement(p.getPNo() + ": " + p.getPName());
}

このようにして、リストのサイズもシリアル化されたファイルに保存されます。

よろしく

于 2013-03-28T14:52:57.747 に答える