使用LookAndFeel进行JFrame序列化

时间:2012-01-24 17:41:18

标签: java swing serialization look-and-feel

我正在尝试序列化包含带有几个JInternalFrame的JDesktopPane的JFrame。 我遇到了LookAndFeel的问题,因为无论出于何种原因,都无法使用与CrossPlatform LnF不同的Swing组件序列化。 所以我写了这个测试程序,以便弄清楚我的可能性:

public static void main(String[] args) {    
    try {
        JFrame f = new JFrame();
        f.setBounds(200,200,200,200);
        JTree tree = new JTree();
        f.add(tree);
        f.setVisible(true);

        UIManager.setLookAndFeel(
                   UIManager.getCrossPlatformLookAndFeelClassName());
        SwingUtilities.updateComponentTreeUI(f);

        ObjectOutputStream oop = new ObjectOutputStream(
                   new FileOutputStream(new File("test.serialized")));
        oop.writeObject(f);
    } catch(IOException e) {
        e.printStackTrace();
    } catch (ClassNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (InstantiationException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (UnsupportedLookAndFeelException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

这不起作用有两个原因:

  1. 我无法序列化框架和包含的树。只是树很好,但就在
  2. 我首先将LookAndFeel设置为跨平台,然后创建我的树。
  3. 知道如何解决这个问题吗?

    编辑: 很抱歉让这个不清楚: 我不是试图序列化LnF或类似的东西。 LnF不希望我序列化帧。

    java.io.NotSerializableException: com.apple.laf.AquaTreeUI
    

    最重要的是,我无法序列化包含树的帧。

    Exception in thread "AWT-EventQueue-0" java.lang.InternalError: incorrect component
    

2 个答案:

答案 0 :(得分:2)

你正在尝试的是不可能的。序列化JFrame对象时,LnF不会以任何方式序列化。那是因为JFrame对此没有记忆。使用什么LnF存储在别处......

我要做的是将JFrame包装在另一个对象中,让我们说MyGUI。在里面,我会将LnF(例如String)存储在私有字段中。最后,序列化MyGUI,并且在反序列化时,你的LnF很好并且完好无损,你可以再次设置它。

答案 1 :(得分:0)

检查this。是由@SoboLAN提出的实现。