对于我的程序,我有两个按钮,“添加”和“保存”。当我点击“添加”时,一个按钮被添加到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
}
}
}
答案 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();
}