Сериализация из actionlistener - PullRequest
0 голосов
/ 04 декабря 2011

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

}

1 Ответ

0 голосов
/ 04 декабря 2011

Расширение слушателя действия и передача дескриптора объекта, который будет сохранен этому слушателю действия в конструкторе.

Для этого вы можете переместить объект для сохранения переменной класса.

public class SaveAction extends ActionListener {

  Control control;

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

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

}

и затем передайте управление при новом сохранении действия в вашем коде выше ...

new SaveAction(this);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...