恢复之前序列化的JFrame对象,如何做到?

3
我已经成功地将包含JTextArea和几个按钮的基本GUI对象序列化到文件“test.ser”中。
现在,我想完全恢复之前保存的状态,但似乎对如何正确反序列化对象状态有误解。
类MyFrame创建JFrame并对其进行序列化。
public class MyFrame extends JFrame implements ActionListener {


 // Fields
 JTextArea textArea;
 String title;
 static MyFrame gui = new MyFrame();
 private static final long serialVersionUID = 1125762532137824262L;


 /**
  * @param args
  */
 public static void main(String[] args) {
  // TODO Auto-generated method stub
  gui.run();
 }

 // parameterless default contructor
 public MyFrame() {

 }

 // constructor with title
 public MyFrame(String title) {

 }

 // creates Frame and its Layout
 public void run() {

  JFrame frame = new JFrame(title);
  JPanel panel_01 = new JPanel();
  JPanel panel_02 = new JPanel();

  JTextArea textArea = new JTextArea(20, 22);
  textArea.setLineWrap(true);

  JScrollPane scrollPane = new JScrollPane(textArea);

  scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED);

  panel_01.add(scrollPane);



  // Buttons
  JButton saveButton = new JButton("Save");
  saveButton.addActionListener(this);
  JButton loadButton = new JButton("Load");
  loadButton.addActionListener(this);


  panel_02.add(loadButton);
  panel_02.add(saveButton);
  // Layout
  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  frame.getContentPane().add(BorderLayout.CENTER, panel_01);
  frame.getContentPane().add(BorderLayout.SOUTH, panel_02);

  frame.setSize(300, 400);
  frame.setVisible(true);
 }

 /*
  * 
  */
 public void serialize() {

  try {
   ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("test.ser"));
   oos.writeObject(gui);
   oos.close();
  } catch (Exception e) {
   // TODO: handle exception
   e.printStackTrace();
  }
 }


 public void actionPerformed(ActionEvent ev) {
  System.out.println("Action received!");
  gui.serialize();
 }

}

我在这里尝试进行反序列化:

public class Deserialize {
 static Deserialize ds;
 static MyFrame frame;



 public static void main(String[] args) {
  try {
   ObjectInputStream ois = new ObjectInputStream(new FileInputStream("test.ser"));
    frame = (MyFrame) ois.readObject();
    ois.close();
  } catch (FileNotFoundException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (ClassNotFoundException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
 }

也许有人可以指引我方向,帮我纠正错误的认识吗?
你们会如何编写一个类来反序列化并恢复之前序列化的GUI元素到它们之前序列化的状态?
目前我正在做的方式似乎在概念上有不止一个缺陷,对吧?
2个回答

1
发生了什么?你是否遇到了异常?从代码的外观来看,ds 从未被初始化。我认为,在反序列化后,您需要使用 frame.setVisible(true); 显示框架。一如既往,Swing(实际上是 AWT)应该仅在 AWT 事件分派线程(EDT)上使用 - 使用 java.awt.EventQueue.invokeLater
通常使用静态不是一个好主意。GUI 组件的序列化也不是一个好主意。final 是好的,并且在很大程度上确保实例和静态字段已初始化。

是的,我遇到了NullPointerException异常。我刚刚将代码更改为您现在看到的样子。没有错误消息,但是GUI仍无法进行反序列化。 - jottr

0

正如每个javadoc swing组件所说,序列化JFrame和其他JFoo的首选方法是XMLEncoder

经典序列化在一些小型GUI应用程序中可以工作,但不适用于长期运行的GUI组件应用程序。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接