Java 如何恢复以前序列化的JFrame对象?
我已经成功地将包含一个JTextArea和几个按钮的非常基本的GUI对象序列化到一个文件“test.ser” 现在,我想从“test.ser”完全恢复以前保存的状态,但似乎对如何正确地反序列化对象状态有一个误解 类MyFrame创建JFrame并将其序列化Java 如何恢复以前序列化的JFrame对象?,java,swing,serialization,objectinputstream,Java,Swing,Serialization,Objectinputstream,我已经成功地将包含一个JTextArea和几个按钮的非常基本的GUI对象序列化到一个文件“test.ser” 现在,我想从“test.ser”完全恢复以前保存的状态,但似乎对如何正确地反序列化对象状态有一个误解 类MyFrame创建JFrame并将其序列化 public class MyFrame extends JFrame implements ActionListener { // Fields JTextArea textArea; String title; static
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元素反序列化并恢复到以前序列化的状态
我现在的做法在概念上似乎有不止一个缺陷,对吗?发生了什么?你有例外吗?从代码的外观来看,
ds
从未初始化。我相信,一旦反序列化,您将需要使用frame.setVisible(true)显示框架代码>。和往常一样,Swing(实际上也是AWT)应该只在AWT事件调度线程(EDT)上使用-使用java.AWT.EventQueue.invokeLater
通常使用静力学不是一个好主意。序列化GUI组件也不是一件容易的事final
很好,在大多数情况下,它将确保初始化实例和静态字段。正如在每个javadoc swing组件中所说的,序列化JFrame和其他JFoo的首选方法是
经典的序列化在一些小型GUI应用程序中有效,但在长寿命GUI组件应用程序中无效。是的,我做到了。我有一个空点异常。我刚把代码改成你现在看到的。不再有错误消息,但gui仍然没有反序列化。