2012-03-04 16 views
0

私はこのグレードをコンピュータ科学のクラスのために作っています。私が働かせなかったことの1つはセッションをセーブ/ロードすることです。私が設定したように、終了すると自動的に保存され、ロードするファイルがあれば起動します。しかし、私はそれを間違ってロードしていると思います。すべてのデータを保持する1つのメインJFrameがあり、それが保存されるオブジェクトの1つです。それがロードされたら、あなたを見せてくれるでしょう。ファイルからJFrameを正しく読み込む方法は?

If it looks like this when I close it:

pre-save snapshot

その後の仕事にもpost-load snapshot

it'll look like this when I start it up again:

、 "学生を入力" ボタンと同様に、入力に使用JTextFieldActionListener、中止プログラムがJFrameをロードするとき。プログラムは3クラスファイルに分割されています。

成績表:

import javax.swing.*; 
import java.awt.event.*; 
import java.io.*; 

public class GradeBook implements java.io.Serializable { 
    private static JFrame frame; 
    public static void main(String[] args) throws Exception{ 
     try{ 
      FileInputStream fis = new FileInputStream("t.tmp"); 
      ObjectInputStream ois = new ObjectInputStream(fis); 

      frame = (JFrame) ois.readObject(); 

      ois.close(); 
     } catch(Throwable t) { 
      frame = new JFrame("Course Grades"); 
     } 

     frame.addWindowListener(new closing()); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(new CourseGrade()); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

終値:

private static class closing extends WindowAdapter { 
     public void windowClosing(WindowEvent e) { 
      try { 
       FileOutputStream fos = new FileOutputStream("t.tmp"); 
       ObjectOutputStream oos = new ObjectOutputStream(fos); 

       oos.writeObject(frame); 

       oos.close(); 
      } catch(Throwable t){System.out.println(t.getMessage());} 
     } 
    } 
} 

CourseGrade:第三のクラスは何の関係も持っていないはず

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 
import java.awt.FlowLayout; 
import java.util.Random; 
import javax.swing.table.*; 
import java.io.*; 
public class CourseGrade extends JPanel implements java.io.Serializable { 
    private JLabel entername; 
    private JTextField in; 
    private JTextArea list; 
    private JScrollPane scroll; 
    private String[] students = new String[1000]; 
    private JButton enter; 
    private JButton[] studentbuttons = new JButton[1000]; 
    private JButton[] delete=new JButton[1000]; 
    private int numstudents; 
    private JFrame[] studentframes=new JFrame[1000]; 
    private static JTable[] tables=new JTable[1000]; 
    private static DefaultTableModel[] model=new DefaultTableModel[1000]; 
    private static int[] numass=new int[1000]; 
    public CourseGrade() { 
     String[][] data = {{"", "", "", ""}}; 
     String[] headers = {"Assignment", "Date Assigned", "Score", "Percentage"}; 
     for(int i=0; i<tables.length; i++){ 
      model[i] = new DefaultTableModel(data, headers); 
      tables[i] = new JTable(model[i]){ 
       public boolean isCellEditable(int rowIndex, int colIndex) { 
        return false; 
       } 
      }; 
     } 
     numstudents=0; 
     in=new JTextField(13); 
     in.addActionListener(new enterListener()); 
     list=new JTextArea(); 
     scroll=new JScrollPane(list); 
     list.setEditable(false); 
     entername=new JLabel("Enter a student's name"); 
     enter=new JButton("Enter Student"); 
     enter.addActionListener(new enterListener()); 
     setPreferredSize(new Dimension(260, 300)); 
     setBackground(Color.green); 

     add(entername); 
     add(in); 
     add(enter); 
     add(scroll); 

     scroll.setPreferredSize(new Dimension(240, 200)); 
    } 

    private class enterListener implements ActionListener { 
     public void actionPerformed(ActionEvent event) { 
      String x=in.getText(); 
      String y=""; 
      String z=""; 
      in.setText(""); 
      int a=numstudents+1; 
      if(x.length()>0) x=a+". " + x + "\n"; 
      students[numstudents] = x; 
      if(x.length()>0)numstudents++; 
      for(int i=0; i<numstudents; i++){ 
       x=students[i]; 
       if(x.length()>13)x=x.substring(0,11)+"...\n"; 
       y+=x; 
      } 
      studentbuttons[numstudents]=new JButton("Edit"); 
      studentbuttons[numstudents].addActionListener(new grades()); 
      delete[numstudents]=new JButton("Delete"); 
      delete[numstudents].addActionListener(new del()); 
      list.setText(y); 
      list.add(studentbuttons[numstudents]); 
      studentbuttons[numstudents].setBounds(100,(numstudents-1)*16,55,15); 
      list.add(delete[numstudents]); 
      delete[numstudents].setBounds(160,(numstudents-1)*16,70,15); 
     } 
    } 

    private class grades implements ActionListener { 
     public void actionPerformed(ActionEvent event) { 
      Object obj = event.getSource(); 
      if(obj instanceof JButton){ 
       JButton clicked = (JButton)obj; 
       int x=clicked.getY()/16; 
       String y=students[x]; 
       for(int i=0; i<y.length(); i++){ 
        String q=y.substring(i,i+1); 
        if(q.equals(" ")) { 
         y=y.substring(i+1); 
         i=y.length()+1; 
        } 
       } 
       studentframes[x]=new JFrame(y+"'s Grades"); 
       studentframes[x].setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
       try{studentframes[x].getContentPane().add(new GradePage(x, tables[x], numass[x]));} 
       catch(Exception e){} 
       studentframes[x].pack(); 
       studentframes[x].setVisible(true); 
      } 
     } 
    } 

    private class del implements ActionListener { 
     public void actionPerformed(ActionEvent event) { 
      Object obj = event.getSource(); 
      if(obj instanceof JButton){ 
       JButton clicked = (JButton)obj; 
       int x=clicked.getY()/16; 
       String y="", z=""; 
       studentbuttons[numstudents].setVisible(false); 
       delete[numstudents].setVisible(false); 
       numstudents--; 
       int q=3; 
       int w=0; 
       for(int i=x; i<=numstudents; i++){ 
        if(i<10)q=1; 
        else if(i<100) q=2; 
        tables[i]=tables[i+1]; 
        numass[i]=numass[i+1]; 
        model[i]=model[i+1]; 
        w=i+1; 
        try{if(!students[i+1].equals(null)){students[i]=w+students[i+1].substring(q);} else{students[i]=null;}}catch(Throwable t){} 
       } 
       for(int i=0; i<numstudents; i++){ 
        y=students[i]; 
        if(y.length()>13)y=y.substring(0,11)+"...\n"; 
        z+=y; 
       } 
       list.setText(z); 
      } 
     } 
    } 
    public static void setTable(int numtable, JTable table){ 
     tables[numtable]=table; 
    } 
    public static void newRow(int numtable){ 
     model[numtable].addRow(new Object[]{"", "", "", ""}); 
    } 
    public static void setNumEntries(int numtable, int num){ 
     numass[numtable]=num; 
    } 
} 

これで私は今は投稿していません。

私はこのコードはおそらく書かれていませんが、私はハイスクールのコンピュータサイエンスの2年目に過ぎず、実際にはこれをカバーしていません。このプログラムはGUIでもないと思っていましたが、これは入力ストリームや出力ストリームについて聞いたこともありませんので、実際にはわかりません。私はクラスがjava.io.Serializableを実装することはおそらく不要であることを認識しましたが、これを調べようとしていたときに、自然に実装していないオブジェクトが保存されない方法を知る人が出てきました。それはあなたが愚かな間違いであり、あなたの時間のおかげで申し訳ありません。

+4

を助け、この

try { FileReader file = new FileReader("insert file name here") ; BufferedReader buffer = new BufferedReader(file); String line = "" ; while((line = buffer.readLine()) != null) { System.out.println(line) ; } buffer.close() ; } catch(IOException e) { //Insert error message here } 

希望のようにそれを読むことができますこのタイプの機能代わりに、設定やプロパティを永続化させる、脆弱ではない、他の多くの方法を検討してください。例えば。 [この回答](http://stackoverflow.com/a/7778332/418556)( 'Properties'を使う)のように。 Javaは、情報を保持するための「ベーカーズダース」を提供しています。 –

+1

ユーザがシリアル化とデシリアライズの間でJavaを更新すると、あなたのアプローチが失敗する可能性が非常に高いです。 –

答えて

0

JFrameオブジェクトを保存することをお勧めしません。ここでは、学生の名前を保存し、テキストファイルにグレードを付けることができ、プログラムが読み込まれるたびに、テキストファイルから情報をロードする優れたソリューションです。

ヒント:あなたはdirctly入力&出力ストリームを使用することができますが、それは多分少し行くと読んでこの2つのクラスについてとてもsonfusingです: を

  1. スキャナを(し、ファイルからの読み込みにそれを使用する方法)
  2. のPrintWriter(とどのようにファイルへの書き込みにそれを使用する)

はPS:私はあなたのコードを与えcould'vが、あなたがしようとしている間ので、情報を見つけるために少し苦しむことにより良い学習体験でありますそれを理解するためには、他にもたくさんのことがあります。

+0

オブジェクトを直列化するより良い方法があります – mbatchkarov

0

フレームはアプリケーションの状態の不可欠な部分ではなく、重要な情報(名前、等級)を表示する単なる方法です。セッションを保存する場合は、現在の情報を画面に保存してから、逆シリアル化された情報を使用してJFrameを再作成します。ObjectOutputStreamはディスクに物事を書くうえで妥当な方法であり、ObjectInputStreamはデータを読み込むのに適しています。ドキュメントには良い例があります。また、あなたのクラスはSerializableを実装する必要があります。

+0

同じオブジェクトの複数のインスタンスを読み取るにはどうすればよいですか?私は保存/ロードする必要がある複数のJButton配列を持っていますが、私がreadObjectを使用する場合は、どの2つのセーブ配列をロードするかを指定する方法がわかりません。 – Tim

1

あなたはこの

  try 
      { 
       FileWriter file = new FileWriter("insert file name here"); 
       BufferedWriter buffer = new BufferedWriter(file) ; 
       buffer.write("insert file content here") ; 
       buffer.newLine(); 
       buffer.close(); 
      } 
      catch (IOException e) 
      { 
       //Insert error message here 
      } 

のようなメモ帳のファイルにデータを格納し、私は `Serializable`を実装することはない

関連する問題