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层。因此,如果可以选择的话,我会完全避免使用您当前的实现方法。

10-07 12:57
查看更多