我正在尝试从文件中读取对象以将它们显示在 jpanel 上,但我很难反序列化它们。
public static void saveFile(Screen screen)
{
JFileChooser find = new JFileChooser();
find.setCurrentDirectory(new File(System.getProperty("user.dir")));
int result = find.showSaveDialog(find);
if(JFileChooser.APPROVE_OPTION == result)
{
File file = find.getSelectedFile();
try
{
FileOutputStream fo = new FileOutputStream(file);
ObjectOutputStream os = new ObjectOutputStream(fo);
os.writeInt(screen.getObjects().size());
ImageIO.write(screen.getBackgroundImage(), "png", os);
for(Item i : screen.getObjects())
{
i.removeImage();
os.writeObject(i);
}
os.close();
fo.close();
for(Item i : screen.getObjects())
{
i.setImg();
}
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
public static Screen loadFile()
{
JFileChooser find = new JFileChooser();
find.setCurrentDirectory(new File(System.getProperty("user.dir")));
int result = find.showOpenDialog(find);
if(JFileChooser.APPROVE_OPTION == result)
{
File file = find.getSelectedFile();
try
{
FileInputStream fi = new FileInputStream(file);
ObjectInputStream is = new ObjectInputStream(fi);
int items = is.readInt();
BufferedImage background = ImageIO.read(is);
Screen screen = new Screen();
screen.setBackground(background);
for(int i = 0; i <= items; i++)
{
Item object = (Item) is.readObject();
object.setImg();
screen.addObject(object);
}
is.close();
fi.close();
return screen;
}
catch(OptionalDataException e)
{
System.out.println(e.eof);
e.printStackTrace();
return null;
}
catch(Exception e)
{
e.printStackTrace();
return null;
}
}
}
屏幕和项目对象都实现了可序列化,并且 eof 返回 false,并在背景图像后面显示整数。项目对象都有缓冲图像,我已将这些图像设置为可在 jpanel 上拖动。由于缓冲图像并不是真正可序列化的,因此我从对象中删除图像,然后将它们写入文件,然后在写入完成后重新添加它们以供继续使用,并在读入项目对象时尝试重新制作它们。
我想通了。我将我正在写入的整个文件转换为 png 只是为了背景图像,这搞乱了之后的所有内容。我保存了包含背景图像的文件对象,这似乎有效。