我有一个 JPanel,它是一个通用容器,它可以容纳各种组件并使用各种布局。
我的目的是制作此 JPanel 的深拷贝,以便我可以调整复制的 JPanel 的大小或背景颜色,而不影响原始 JPanel 中的组件。
首先我尝试使用克隆方法,但我发现克隆只是复制顶层,JPanel 中的任何组件都是浅复制的,这意味着我只获得了原始组件的引用。 然后我看到一些文章说可以通过序列化 JPanel 来完成,但是当我这样做时出现以下错误:
java.io.NotSerializedException: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 异常。 还有其他代码可以做到这一点吗?
最佳答案
您收到错误的原因是图像不可序列化。您无法序列化图像,但您可以做的是将图像转换为数组,序列化它,然后恢复它并将其变回图像。这是一个例子:
public int[] getArray(BufferedImage image)
{
int width = image.getWidth();
int height = image.getHeight();
int[] rgbs = new int[width*height];
return image.getRGB(0,0,width,height,rgbs,0,width);
}
public Image getImage(int array[], int width, int height)
{
MemoryImageSource mis = new MemoryImageSource(width,height,array,0,width);
return Toolkit.getDefaultToolkit().createImage(mis);
}
这些方法将进入实现可序列化的类内部
关于java - 在java中获取自定义JPanel的深拷贝,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6620222/