Я пытаюсь сериализовать все мои объекты, когда пользователь нажимает на команду Сохранить меню Файл.Если я правильно понимаю, defaultReadObject()
и defaultWriteObject()
сохраняют все мои объекты, кроме статических элементов, поэтому я попытался использовать их.Моя программа - это своего рода программа для рисования графиков.Он имеет контрольную рамку, в которой пользователь может настроить алгоритм запуска, и другую рамку, в которой нарисован график. Пользователь может нажать на следующую и предыдущую кнопку, чтобы увидеть, через какие узлы проходит алгоритм.Поэтому я хотел бы сохранить фактическое состояние чертежа, чтобы пользователь мог продолжить пошаговое выполнение после выхода.Я читал, что defaultWriteObject
должен вызываться из метода writeObject
, но моя проблема в том, что я не знаю, как мне сохранить экземпляр класса 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();
}
}
}