我正在尝试序列化包含 JDesktopPane 和多个 JInternalFrame 的 JFrame。 我遇到了 LookAndFeel 的问题,因为无论出于何种原因,都不可能将 Swing 组件与 CrossPlatform LnF 不同的组件序列化。 所以我编写了这个测试程序来找出我的可能性:
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();
}
}
这不起作用有两个原因:
- 我无法序列化框架和包含的树。只是树很好,但只是当
- 我首先将 LookAndFeel 设置为跨平台,然后创建我的树。
知道如何解决这个问题吗?
编辑: 抱歉,没有说清楚: 我并不是想序列化 LnF 或类似的东西。 LnF 不希望我序列化 Frame。
java.io.NotSerializableException: com.apple.laf.AquaTreeUI
最重要的是,我无法序列化包含树的框架。
Exception in thread "AWT-EventQueue-0" java.lang.InternalError: incorrect component
最佳答案
你正在尝试的是不可能的。当您序列化 JFrame 对象时,LnF 不会以任何方式序列化。这是因为 JFrame 不保留这一点。 LnF 所使用的内容存储在其他地方......
我要做的是将 JFrame 包装在另一个对象中,比如说 MyGUI。在其中,我会将 LnF (例如作为字符串)存储在私有(private)字段中。最后,序列化 MyGUI,在反序列化时,您的 LnF 完好无损,您可以再次设置它。
关于java - 使用 LookAndFeel 进行 JFrame 序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8991465/