public void load()
{
final JFileChooser fc = new JFileChooser();
int returnVal = fc.showOpenDialog(this);
if(returnVal == JFileChooser.APPROVE_OPTION)
{
try{
FileInputStream f_in = new FileInputStream(fc.getSelectedFile());
ObjectInputStream obj_in = new ObjectInputStream(f_in);
Frame f2 = (Frame)obj_in.readObject();
obj_in.close();
f2.setVisible(true);
}
catch(Exception ex){
}
}
}
最佳答案
我会尝试在setVisible调用之前将调用添加到框架上的pack方法。这应该使它可以显示并正确调整大小。
FileInputStream f_in = new FileInputStream(fc.getSelectedFile());
ObjectInputStream obj_in = new ObjectInputStream(f_in);
Frame f2 = (Frame)obj_in.readObject();
obj_in.close();
f2.pack()
f2.setVisible(true);
如果这不起作用,则在调用打包后检查f2.isDisplayable()的返回值。如果为假,则表示该框架未连接到本机屏幕资源(我相信压缩包应该处理该资源,但是在反序列化场景中不确定这一点)。
如果框架包含Swing组件,则另一个问题可能是对框架进行序列化的JVM与对其进行反序列化的JVM之间的不兼容性。 Swing组件的javadocs中有关于在对其使用序列化时切换JVM版本的警告。
通常,如果可以选择序列化任何内容,则应该仅是数据模型,而不是视图/表示/ GUI层。因此,如果可以选择的话,我会完全避免使用您当前的实现方法。