Java 从actionlistener序列化

Java 从actionlistener序列化,java,swing,serialization,Java,Swing,Serialization,当用户单击“文件”菜单上的“保存”命令时,我正在尝试序列化所有对象。 如果我理解正确,defaultReadObject和defaultWriteObject会保存除静态成员之外的所有对象,因此我尝试使用它们。我的程序是一种图形绘制程序。它有一个控制框,用户可以在其中设置要运行的算法,还有一个绘制图形的框。用户可以单击“下一个”和“上一个”按钮,查看算法要经过的节点。因此,我希望保存图形的实际状态,以便用户可以在退出后继续执行步骤。 我已经读到应该从writeObject方法调用defaultW

当用户单击“文件”菜单上的“保存”命令时,我正在尝试序列化所有对象。 如果我理解正确,defaultReadObject和defaultWriteObject会保存除静态成员之外的所有对象,因此我尝试使用它们。我的程序是一种图形绘制程序。它有一个控制框,用户可以在其中设置要运行的算法,还有一个绘制图形的框。用户可以单击“下一个”和“上一个”按钮,查看算法要经过的节点。因此,我希望保存图形的实际状态,以便用户可以在退出后继续执行步骤。 我已经读到应该从writeObject方法调用defaultWriteObject,但我的问题是我不知道如何从actionlistener保存控件和Draw2类的实例,这是在主函数中创建的? 我的代码的相关部分:

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
    }
}

}

扩展操作侦听器,并将要保存的对象的句柄传递给构造函数中的此操作侦听器

您可以将要保存的对象移动到一个类变量来执行此操作

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);

为了更快地获得更好的帮助,请发布一个。另外,通常每个应用程序只能创建一个帧。其余的通常是对话框或选项窗格。感谢您的帮助,但您能否更具体一点,因为我不太明白您要做什么。非常感谢,保存现在运行得很好,但我还有最后一个关于加载的问题。我编辑了我的帖子,并将我的问题附加到最后。执行与SaveAction相同的操作。在LoadAction的构造函数中传递控件对象的引用。如果我误解了某些内容,很抱歉,但我尝试了。用构造函数再次编辑我的帖子,但像这样,我将当前对象复制到cont变量,当actionPerformed方法更改它时,它会更改contr变量,并且对正在运行的对象没有影响。您不能替换原始对象,但可以手动将内容复制到其中,也可以在加载时将加载操作放置在类外部并替换为新对象-因此旧对象将被处置并替换为新对象。因此,在该控件的容器中用新控件对象替换旧控件对象。如果有意义的话,可以使用一个内部类和一个可在此操作中访问的共享类变量来完成此操作。
new SaveAction(this);