Получение глубокой копии настроенного JPanel в Java - PullRequest
1 голос
/ 08 июля 2011

У меня есть JPanel, и это общий контейнер, он может содержать различные компоненты и использовать различные макеты.

Моя цель - сделать глубокую копию этой JPanel, чтобы я мог изменить размер или изменить цвет фона копируемой копии без воздействия на компоненты в исходной JPanel.

Сначала я попытался использовать подход Clone, но я обнаружил, что Clone просто копирует верхний уровень, все компоненты в JPanel копируются поверхностно, что означает, что я просто получил ссылки на компоненты origianl. и затем я увидел, что в некоторых статьях говорится, что это можно сделать путем сериализации JPanel, но при этом я получаю следующую ошибку:

java.io.NotSerializableException: sun.awt.windows.Win32OffScreenImage

У кого-нибудь есть идеи?

Спасибо, Sathish

Обновление ::

Это код для глубокого копирования.

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

Я передаю JPanel, которая содержит 2 панели, jtable, 2 кнопки. Но теперь я получаю исключение NullPointer. Есть ли другой код для этого?

1 Ответ

0 голосов
/ 08 июля 2011

Причина, по которой вы получаете ошибку, состоит в том, что изображение не сериализуемо.Вы не можете сериализовать изображение, но вы можете превратить изображение в массив, сериализовать его, затем восстановить и снова превратить в изображение.Вот пример:

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

...