如何保存程序的状态?

时间:2016-03-02 02:36:07

标签: java swing button serialization

对于我的程序,我有两个按钮,“添加”和“保存”。当我点击“添加”时,一个按钮被添加到JPanel。 我的问题是,如何使用用户添加的所有按钮保存程序的当前状态?我是否使用序列化? 以下是我的代码片段:

public class saveButton
{
   //JFrame and JPanels have been declared earlier

   class ClickListener implements ActionListener
   {
       public void actionPerformed(ActionEvent e)
       {
           String str = JOptionPane.showInputDialog("Name of button");
           JButton b = new JButton(str);
           frame.add(b);
       }
   }
   ActionListener addButtonClicked = new ClickListener();
   b.addActionListener(addButtonClicked);

   class ClickListenerTwo implements ActionListener
   {
       public void actionPerformed(ActionEvent f)
       {
           //save all of the program 
       }

   } 

}

3 个答案:

答案 0 :(得分:1)

如果您的对象和类中的每个非瞬态成员都支持序列化,则只能序列化(意味着直接Java序列化)。这并非总是可行。

但是,您可以定义自己的配置对象,其中包含必要的状态信息并保存它(可能就在关闭应用程序之前,可能每次状态更改时,都取决于您)并且序列化可能是一种方式做到这一点

答案 1 :(得分:0)

这取决于你如何保存它。您可以将状态写入文件,然后通过读取它从那里恢复。按钮数量和订单等。您还必须决定如何保存它的格式。例如,您可能希望存储在一行

保存,JButton的,imageSrc,XPOS,ypos

因此,当您阅读该行并在'上分享时,'你知道Save是文本,JButton是类等。

希望这有帮助

答案 2 :(得分:0)

我会编写自己的文件格式,而不是处理Java序列化的开销。这样做的好处是在其他语言中更容易阅读,性能稍好一些。此外,正如@MadProgrammer所指出的那样,目前还不支持序列化Swing对象,并且与以后的版本不兼容:

  

警告:此类的序列化对象与之不兼容   未来的Swing发布。目前的序列化支持是   适用于运行的应用程序之间的短期存储或RMI   相同版本的Swing。截至1.4,支持长期存储   所有JavaBeans™都已添加到java.beans包中。请参阅   XMLEncoder

link

以下是一个例子:

public void saveState(){
    File stateFile = new File("./stateFile");
    FileOutputStream fos = new FileOutputStream(stateFile);
    DataOutputStream dos = new DataOutputStream(fis);

    for(JButton button : jButtons){ //store the buttons in an arraylist when they are created (you could also iterate over the added components and use instanceof)
        dos.writeUTF(button.getText());
    }

    dos.writeUTF("end"); //have some sort of end marker

    dos.flush();
    dos.close();
    fos.flush();
    fos.close()
}

public void loadState(){
    File stateFile = new File("./stateFile");
    FileInputStream fis = new FileInputStream(stateFile);
    DataInputStream dis = new DataInputStream(fis);
    String name;

    while(!(name = dis.readUTF()).equals("end")){
        add(new JButton(name));
    }

    fis.close();
}