【发布时间】:2011-07-08 05:13:37
【问题描述】:
我有一个 JPanel,它是一个通用容器,它可以容纳不同的组件并使用不同的布局。
我的目的是制作此 JPanel 的深层副本,以便我可以调整复制的 JPanel 的大小或更改背景颜色,而不会影响原始 JPanel 中的组件。
首先我尝试使用 Clone 方法,但我发现 Clone 只是复制顶层,JPanel 中的任何组件都是浅复制的,这意味着我只是得到了原始组件的引用。 然后我看到一些文章说可以通过序列化JPanel来完成,但是这样做时出现以下错误:
java.io.NotSerializableException:sun.awt.windows.Win32OffScreenImage
有人知道吗?
谢谢, 萨蒂什
更新::
这是获取深拷贝的代码。
static public Object deepCopy(Object oldObj) throws Exception {
ObjectOutputStream oos = null;
ObjectInputStream ois = null;
try {
ByteArrayOutputStream bos =
new ByteArrayOutputStream(); // A
oos = new ObjectOutputStream(bos); // B
oos.writeObject(oldObj); // C
oos.flush(); // D
ByteArrayInputStream bin =
new ByteArrayInputStream(bos.toByteArray()); // E
ois = new ObjectInputStream(bin); // F
return ois.readObject(); // G
} catch (Exception e) {
System.out.println("Exception in ObjectCloner = " + e);
throw (e);
} finally {
oos.close();
ois.close();
}
}
我正在传递包含 2 个面板、jtable、2 个按钮的 JPanel。 但现在我得到 NullPointer 异常。 有没有其他代码可以做到这一点?
【问题讨论】:
-
解决
NotSerializableException使用implements Serializable -
还有其他代码可以做到这一点吗?
-
您说您有一个通用面板,但我想您知道该面板是如何构建的吗?为什么不以同样的方式创建一个新实例?
-
@kaj:但我想要自定义 JPanel 的深层副本。
-
@Satish。深拷贝什么?正如我所说,以与创建另一个实例相同的方式创建新实例。然后它将与另一个相同。有什么问题?
标签: java swing jpanel deep-copy