我正在尝试序列化包含带有几个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();
}
}
这不起作用有两个原因:
知道如何解决这个问题吗?
编辑: 很抱歉让这个不清楚: 我不是试图序列化LnF或类似的东西。 LnF不希望我序列化帧。
java.io.NotSerializableException: com.apple.laf.AquaTreeUI
最重要的是,我无法序列化包含树的帧。
Exception in thread "AWT-EventQueue-0" java.lang.InternalError: incorrect component
答案 0 :(得分:2)
你正在尝试的是不可能的。序列化JFrame对象时,LnF不会以任何方式序列化。那是因为JFrame对此没有记忆。使用什么LnF存储在别处......
我要做的是将JFrame包装在另一个对象中,让我们说MyGUI。在里面,我会将LnF(例如String)存储在私有字段中。最后,序列化MyGUI,并且在反序列化时,你的LnF很好并且完好无损,你可以再次设置它。
答案 1 :(得分:0)
检查this。是由@SoboLAN提出的实现。