3

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 要素をデシリアライズして、以前にシリアライズされた状態に復元するクラスをどのように作成しますか?

私が現在行っている方法には、そのコンセプトに複数の欠陥があるようですよね?

4

2 に答える 2

1

何が起こるのですか?例外が発生していますか?コードの外観から、ds初期化されることはありません。デシリアライズしたら、フレームを で表示する必要があると思いますframe.setVisible(true);。いつものように、Swing (そして実際には AWT) は、AWT Event Dispatch Thread (EDT) でのみ使用する必要があります - use java.awt.EventQueue.invokeLater.

一般に、静的を使用することはお勧めできません。また、GUI コンポーネントのシリアル化も行いません。finalほとんどの場合、インスタンスと静的フィールドが初期化されていることを確認します。

于 2010-04-26T08:53:08.713 に答える
0

すべての javadoc スイング コンポーネントで述べられているように、JFrame やその他の JFoo をシリアル化するための推奨される方法はXMLEncoderです。

従来のシリアル化は、一部の小さな GUI アプリケーションでは機能しますが、長寿命の GUI コンポーネント アプリケーションでは機能しません。

于 2010-04-26T09:53:07.127 に答える