如何从文件中正确加载JFrame?

时间:2012-03-04 20:12:30

标签: java swing serialization 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

此外,当程序加载JFrame时,“输入学生”按钮以及用于输入的ActionListener上的JTextField将停止工作。该程序分为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;
    }
}

第三课不应该与此有任何关系,所以我暂不发布。

我意识到代码编写得很糟糕,但我只是在高中计算机科学的第二年,我们实际上并没有涵盖任何这些。这个程序甚至不应该是一个GUI,这是我第一次听说输入或输出流,所以我真的对它们一无所知。我现在意识到让类实现java.io.Serializable可能是不必要的,但是当我试图研究这个时,我遇到了一些有关如何无法保存某些对象的人,因为他们并不自然地实现它。很抱歉,如果这是一个愚蠢的错误,谢谢你的时间。

3 个答案:

答案 0 :(得分: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
    }

希望有所帮助

答案 1 :(得分:0)

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

提示:您可以使用输入和输入输出流直接,但它可能有点融合,所以去阅读这两个类:

  1. 扫描仪(以及如何使用它来读取文件)
  2. PrintWriter(以及如何使用它来写入文件)
  3. PS:我可以给你一些代码但是学习经验要好一点才能找到信息,因为当你想弄明白时,你会学到很多其他东西。

答案 2 :(得分:0)

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