gpt4 book ai didi

java - 恢复以前序列化的 JFrame 对象,如何?

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:19:31 25 4
gpt4 key购买 nike

我已经设法将包含 JTextArea 和一些按钮的非常基本的 GUI 对象序列化到文件“test.ser”中。

现在,我想从“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 元素反序列化并恢复到它们之前的序列化状态?

我现在这样做的方式似乎在其概念上有不止一个缺陷,对吧?

最佳答案

会发生什么?你有异常(exception)吗?从代码的外观来看,ds 从未被初始化。我相信,一旦反序列化,您将需要使用 frame.setVisible(true); 显示框架。与往常一样,Swing(实际上是 AWT)应该仅在 AWT 事件调度线程 (EDT) 上使用 - 使用 java.awt.EventQueue.invokeLater

通常使用静态不是一个好主意。序列化 GUI 组件也不是。 final 很好,并且在大多数情况下会确保初始化实例和静态字段。

关于java - 恢复以前序列化的 JFrame 对象,如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2712001/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com