Сериализация в Java, повторное накачивание объекта в событии? - PullRequest
2 голосов
/ 04 декабря 2011

Я пытаюсь узнать больше о Java. Эта программа - попытка понять события так же как сериализацию. То, что я пытаюсь сделать, это сгладить объект, когда пользователь закрывает JFrame, и заново раздувать его при запуске программы. Я знаю, что могу создать сериализованный файл, но его повторное использование не работает Любая помощь в правильном направлении была бы замечательной. Заранее спасибо.

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import javax.swing.Timer;
import java.io.*;
import java.io.Serializable;
import java.io.ObjectOutputStream;
import java.io.ObjectInputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class tempusFugit extends JFrame implements ActionListener, Serializable, WindowListener
{
String fileN = "tf.txt"; 
public int ToL = 0;
String outT = Integer.toString(ToL);
    JLabel jl = new JLabel(outT);

FileOutputStream fos = null;
ObjectOutputStream out = null;

public tempusFugit()

{
    Timer timer = new Timer(1000, this);

    setBounds(250, 250, 250, 190);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setLayout(new FlowLayout(FlowLayout.LEFT) );
    setVisible(true);
    add(jl);
    timer.start();
}

public void actionPerformed(ActionEvent e)
{
    ++ToL;
    outT = Integer.toString(ToL);
    jl.setText(outT);
    validate();
    repaint();
}
public static void main(String[] args)
{
    tempusFugit tf = new tempusFugit();
    tf.addWindowListener( tf );

}
public void windowDeactivated(WindowEvent e)
{
}
public void windowActivated(WindowEvent e)
{   
}
public void windowDeiconified(WindowEvent e)
{
}
public void windowIconified(WindowEvent e)
{
}
public void windowClosed(WindowEvent e)
{
}
public void windowClosing(WindowEvent e)
{
    try
    {
        fos = new FileOutputStream(fileN);
        out = new ObjectOutputStream(fos);
        out.writeObject(this);
        out.close();

    }
    catch(IOException ex)
    {
}
}
public void windowOpened(WindowEvent e)
{
try
    {
        tempusFugit tf = new tempusFugit();
        FileInputStream fis = new FileInputStream(fileN);
        ObjectInputStream in = new ObjectInputStream(fis);
        tf = (tempusFugit)in.readObject();
        this.ToL = tf.ToL;
    }
    catch(IOException ex)
    {
    }
    catch(ClassNotFoundException ce)
    {
    }

}

}

Полагаю, я пытаюсь воссоздать объект в неподходящее время. Даже если объект сериализован правильно, я не могу получить к нему доступ снова с помощью функции windowOpened. Нужно ли пытаться использовать

private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException;

как-то?

В результате я получаю сообщение об ошибке, в котором говорится, что я пытаюсь получить доступ к объекту Final (я предполагаю, что это). Я нахожу это очень странным, что я не могу заселить свое текущее «это» другим подобным объектом.

Я далеко от базы?

Еще раз спасибо за ваше время.

1 Ответ

3 голосов
/ 04 декабря 2011

Обратите внимание, что есть гораздо более простые способы сделать это, чем сериализовать кадр, и гораздо лучше сериализовать, чем сам кадр.

См. Каков наилучший способ установки местоположений JFrame в Java? для примера сохранения местоположения и размера кадра.Было бы тривиально адаптировать это для хранения счетчика.


Но вот попытка, основанная на вашем коде.

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import javax.swing.Timer;
import java.io.*;
import java.io.Serializable;
import java.io.ObjectOutputStream;
import java.io.ObjectInputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class tempusFugit extends JFrame implements ActionListener, Serializable, WindowListener
{
    String fileN = "tf.txt";
    public int ToL = 0;
    JLabel jl = new JLabel("" + ToL);

    public tempusFugit()
    {
        Timer timer = new Timer(1000, this);

        setBounds(250, 250, 250, 190);
        setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
        setLayout(new FlowLayout(FlowLayout.LEFT) );
        setVisible(true);
        add(jl);
        timer.start();
    }

    public void actionPerformed(ActionEvent e)
    {
        ++ToL;
        jl.setText("" + ToL);
        validate();
        repaint();
    }

    public static void main(String[] args)
    {
        tempusFugit tf = new tempusFugit();
        tf.addWindowListener( tf );
    }

    public void windowDeactivated(WindowEvent e){}
    public void windowActivated(WindowEvent e){}
    public void windowDeiconified(WindowEvent e){}
    public void windowIconified(WindowEvent e){}
    public void windowClosed(WindowEvent e){}

    public void windowClosing(WindowEvent e)
    {
        try
        {
            FileOutputStream fos = new FileOutputStream(fileN);
            ObjectOutputStream out = new ObjectOutputStream(fos);
            out.writeObject(this);
            out.flush();
            out.close();
            setVisible(false);
            System.exit(0);
        }
        catch(IOException ex)
        {
            JOptionPane.showMessageDialog(null, ex);
            System.exit(1);
        }
    }

    public void windowOpened(WindowEvent e)
    {
        try
        {
            tempusFugit tf;// = new tempusFugit();
            FileInputStream fis = new FileInputStream(fileN);
            ObjectInputStream in = new ObjectInputStream(fis);
            tf = (tempusFugit)in.readObject();
            this.ToL = tf.ToL;
            //tf.setVisible(false);
        }
        catch(IOException ex)
        {
            ex.printStackTrace();
        }
        catch(ClassNotFoundException ce)
        {
            ce.printStackTrace();
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...