Я пытаюсь узнать больше о 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 (я предполагаю, что это). Я нахожу это очень странным, что я не могу заселить свое текущее «это» другим подобным объектом.
Я далеко от базы?
Еще раз спасибо за ваше время.