2011-12-04 9 views
0

ユーザーが[ファイル]メニューの[保存]コマンドをクリックしたときに、すべてのオブジェクトをシリアル化しようとしています。 正しく理解していれば、defaultReadObject()defaultWriteObject()は静的メンバー以外のすべてのオブジェクトを保存するので、これらを使用しようとしました。私のプログラムは一種のグラフ描画プログラムです。これには、ユーザーが実行するアルゴリズムを設定できるコントロールフレームと、グラフが描かれている他のフレームがあります。ユーザーは、次のボタンと前のボタンをクリックして、アルゴリズムがどのノードを通過しているかを見ることができます。だから私は描画の実際の状態を保存して、ユーザーが終了後にステッピングを続けることができるようにしたいと思います。 defaultWriteObjectwriteObjectメソッドから呼び出されるべきですが、私の問題は、main関数で作成されたactionlistenerからControlおよびDraw2クラスのインスタンスを保存する方法がわかりません。 私のコードの関連部分:actionlistenerからシリアル化

public class Control extends JPanel implements Serializable{ 

private String sourceFolder; 
private String selectedAlg; 
public List<Node> nodeList; 
private JMenuBar jMenuBar; 
private JMenu jMenu; 
private JMenuItem jMenuItem; 
private Draw2 draw; 
private Search s; 
//... 
//and a lot more variables 

void createControl(JFrame f, Draw2 d){ 
    jMenuBar = new JMenuBar(); 
    jMenu = new JMenu(); 
    jMenuItem = new JMenuItem(); 

    jMenu.setText("File"); 
    jMenuBar.add(jMenu); 

    jMenuItem.setText("Save"); 
    jMenuItem.addActionListener(new SaveAction()); 

    jMenu.add(jMenuItem); 

    //building the control window with textfields, buttons.. 

    draw=d; 
    s=new Search(); 
} 

private void writeObject(ObjectOutputStream out) throws IOException { 

     out.defaultWriteObject(); 
} 

//inner class, actionlistener for save menuItem 
public class SaveAction implements ActionListener{ 
    public void actionPerformed(ActionEvent arg0) { 

     try { 
      FileOutputStream f = new FileOutputStream("savedfile"); 
      ObjectOutputStream out = new ObjectOutputStream(f); 

      //So how can save the instance of control and draw class 
//here, which is created in the main function? 
//how to call writeObject and with what parameter? 

     } catch (IOException o) { 
     } 
    } 
} 

public static void main(String[] args){ 

    JFrame frame = new JFrame("Control"); 
    JFrame frame2 = new JFrame("Draw"); 

    Control cont = new control(); 
    Draw2 gp = new Draw2(cont); 

    cont.createControl(frame, gp); 

    frame.setJMenuBar(cont.jMenuBar); 
    gp.setPreferredSize(new Dimension(0,0)); 
    //Control Frame 
    frame.setSize(800,330); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.add(cont, BorderLayout.NORTH); 
    frame.setVisible(true); 
    //Drawing Frame 
    frame2.setSize(800,600); 
    frame2.setLocation(0, 330); 
    frame2.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame2.add(gp); 
    frame2.setVisible(true);   

} 

} 

public class Draw2 extends JPanel implements Serializable{ 

    public boolean toDraw = false; 
    public boolean timedDraw = false; 
    public boolean steppedDraw = false; 
    private control c; 

    public Draw2(control co){ 
     c=co; 
    } 
    public void paintComponent (Graphics g) { 
    //drawing the graph 
    } 
} 

そして、もう一つ最後の質問。保存されたファイルからオブジェクトをロードすると、実行中のオブジェクトをロードされたオブジェクトに置き換えることはできますか?私はパラメータを使ってそれを行うことを考えましたが、actionPerformedはActionEvent以外のパラメータを持つことはできません。

public class LoadAction implements ActionListener{ 

     Control contr; 

     public LoadAction(Control control) { 
      contr = control; 
     } 

    public void actionPerformed(ActionEvent arg0) { 
     try { 
      FileInputStream f = new FileInputStream("savedfile"); 
      ObjectInputStream in = new ObjectInputStream(f); 
      contr= (Control)in.readObject(); 
      //so now I have the loaded object in the contr object, 
      //but How can copy it over the current object? 
      in.close(); 

      System.out.println(contr.aktIndex); 
     } catch (IOException o) { 
      o.printStackTrace(); 
     } catch (ClassNotFoundException e) { 
      e.printStackTrace(); 
     } 
    } 

}

+0

、[SSCCE](http://sscce.org/)を投稿してください。そして、脇に一般的にアプリケーションごとに1つのフレームしか作成されません。残りの部分は通常、ダイアログまたはオプションペインになります。 –

答えて

0

アクションリスナーを拡張し、コンストラクタでこのアクションリスナーに保存するオブジェクトのハンドルを渡します。

これを行うには、保存するオブジェクトをクラス変数に移動できます。

public class SaveAction extends ActionListener { 

    Control control; 

    public SaveAction(Control control) { 
    this.control = control; 
    } 

    public void actionPerformed(ActionEvent e) { 
    // your save code here 
    } 

} 

、その後、上記のコードでは、あなたの新しいSaveAction制御を渡す...早いほど良いのヘルプについて

new SaveAction(this); 
+0

私を助けていただきありがとうございますが、あなたがしようとしていることを本当に理解していないため、より具体的になりますか? – user1067279

+0

アップデートを参照してください –

+0

ありがとうございます、保存は今完全に動作していますが、私はロードに関する最後の質問があります。私は私の投稿を編集し、最後に私の質問を追加しました。 – user1067279

関連する問題