Как правильно загрузить JFrame из файла? - PullRequest
0 голосов
/ 05 марта 2012

Я пишу эту программу для моего класса информатики, и единственное, чего я не добился - это сохранение / загрузка сессий.Как я настроил сейчас, он автоматически сохраняет при выходе и загружает при запуске, если есть файл для загрузки.Однако я чувствую, что загружаю или сохраняю его неправильно;есть один основной JFrame, который содержит все данные, и это единственный объект, который сохраняется.Когда он загружен, вам будет проще его показать.

Если при закрытии это выглядит так: :

pre-save snapshot

Тогда будет выглядеть так, когда я снова запусту его:

post-load snapshot

Кроме того, кнопка «Войти в ученика», а такжеActionListener на JTextField, используемом для ввода, перестает работать, когда программа загружает 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, вероятно, не было необходимости, но когда я пытался исследовать это, я столкнулся с кем-то, кто задумывался над тем, как некоторые объекты не могут быть сохранены, потому что они не реализуют его естественным образом.Извините, если это какая-то глупая ошибка, и спасибо за ваше время.

Ответы [ 3 ]

1 голос
/ 24 октября 2015

Вы можете сохранить данные в файле блокнота следующим образом

            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
    }

Надеюсь, что поможет

0 голосов
/ 05 марта 2012

Рамка не является неотъемлемой частью состояния вашего приложения, это просто способ отображения важной информации (имена, оценки и т. Д.). Если вы хотите сохранить сеанс, сохраните информацию, которая в данный момент находится на экране, а затем заново создайте JFrame с десериализованной информацией. ObjectOutputStream - это разумный способ записи данных на диск, а ObjectInputStream хорош для чтения данных обратно. Документация содержит хорошие примеры. Кроме того, ваши классы должны были бы реализовать Serializable.

0 голосов
/ 05 марта 2012

Я не рекомендую вам сохранять объект JFrame.Вот лучшее решение: вы можете сохранить имя ученика и его оценки в текстовом файле, и при каждой загрузке вашей программы она будет загружать информацию из текстового файла.

Подсказка: вы можете напрямую использовать потоки ввода и выводано, может быть, это немного забавно, так что читайте об этих двух классах:

  1. Сканер (и как использовать его для чтения из файла)
  2. PrintWriter (и как его использоватьзаписать в файл)

PS: я мог бы дать вам код, но гораздо лучше научиться немного страдать, чтобы найти информацию, потому что, пока вы пытаетесь понять это, выузнает много других вещей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...