java - 在java中获取自定义JPanel的深拷贝

标签 java swing jpanel deep-copy

我有一个 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/

相关文章:

java - 根据父级调整大小最小化或框架的对话框

java - 在 JPanel 中设置焦点

java - Java中GUI JLabel实践

java - 多个动态 HTTP 端点

java - 每当我尝试创建递归方法时,我总是遇到相同的错误

java - 我的自定义 JDialog 出现,但为空

java - PaintComponent() 函数调用

java - 试图弄清楚 CardLayout

Java 编程 - SQL 语句应该存储在哪里?

java - api低于26的设备如何使用base 64?