2012-03-04 122 views
0

我正在为我的计算机科学课进行这个年级保留课程,而我还没有开始工作的一件事就是保存/加载课程。正如我现在设置它,它会自动保存,当你退出时加载,当你启动时加载,如果有文件加载。但是,我觉得我正在加载或保存不正确;有一个主要的JFrame包含所有的数据,并且这是保存的一个对象。当它被加载时,它会更容易向你展示。如何从文件正确加载JFrame?

If it looks like this when I close it:

pre-save snapshot

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

post-load snapshot

此外, “输入学生” 按钮,以及用于输入对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; 
    } 
} 

第三类不应该有什么关系有了这个,所以我现在不会发布它。

我意识到代码可能写得不好,但我只是在高中计算机科学的第二年,我们并没有真正涉及到这一点。这个程序甚至不应该是一个图形用户界面,这是我第一次听说过输入或输出流,所以我真的不知道它们。我现在意识到让这些类实现java.io.Serializable可能是不必要的,但是当我试图研究这个时,我遇到了一些人在考虑如何保存某些对象,因为它们不会自然地实现它。非常抱歉,如果这是一个愚蠢的错误,并感谢您的时间。

+4

我不会被执行'Serializable'用于阅读这种类型的功能。相反,请看一系列其他不太脆弱的持久设置和属性的方法。例如。在[这个答案](http://stackoverflow.com/a/7778332/418556)(它使用'属性')。 Java提供了一种“面包师”来坚持信息。 – 2012-03-04 20:21:15

+1

如果用户在序列化和反序列化之间更新他的Java,那么很可能你的方法会失败。 – 2012-03-04 20:32:00

回答

0

我不建议你保存JFrame对象。这里有一个更好的解决方案,你可以保存学生的姓名和成绩在文本文件上,每次你的程序加载时都会从文本文件中加载信息。

提示:您可以使用输入&输出流消法,但它也许有点sonfusing所以,去了解这两个类:

  1. 扫描仪(以及如何使用它从文件中读取)
  2. PrintWriter的(以及如何使用它来写入文件)

PS:我could'v给你的代码,但它是更好的学习体验挨一点点地查找信息,因为当你试图弄清楚你会学会还有很多其他的事情。

+0

有更好的方法序列化对象 – mbatchkarov 2012-03-04 22:43:02

0

框架不是应用程序状态的组成部分,它只是显示重要信息(名称,等级等)的一种方式。如果要保存会话,请保存当前屏幕上的信息,然后使用反序列化的信息重新创建JFrame。一个ObjectOutputStream是写东西到磁盘的一种合理的方式,并且ObjectInputStream适合于读取返回的数据。该文档包含很好的示例。此外,您的课程需要实施Serializable

+0

如何读取同一对象的多个实例?我有多个JButton数组,我需要保存/加载,但是如果使用readObject,我不知道如何指定要加载的两个保存数组中的哪一个。 – Tim 2012-03-05 02:47:04

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 
      } 

再这样

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 
    } 

希望帮助