【问题标题】:Getting Deep copy of customized JPanel in java在java中获取自定义JPanel的深层副本
【发布时间】: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


【解决方案1】:

您收到错误的原因是 Image 不可序列化。您无法序列化图像,但您可以将图像转换为数组,对其进行序列化,然后将其恢复并重新转换为图像。举个例子:

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);
}

这些方法将进入实现 Serializable 的类中

【讨论】:

  • 我在 JPanel 中没有图像,它包含 2 个面板、2 个按钮、1 个表,仅此而已。
猜你喜欢
  • 2018-07-12
  • 2013-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-26
  • 2011-05-03
  • 1970-01-01
相关资源
最近更新 更多