2011-07-08 32 views
1

我有一個JPanel,它是一個通用容器,它可以容納各種組件並使用各種佈局。在java中獲取自定義JPanel的深層副本

我的目的是製作此JPanel的深層副本,以便我可以調整或更改複製的背景顏色,而不會影響原始JPanel中的組件。

首先我嘗試使用克隆方法,但我發現克隆只是複製頂層,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包含2panels,jtable,2buttons。 但現在我得到NullPointer異常。 有沒有其他的代碼可以做到這一點?

+0

爲了解決內部'NotSerializableException'使用'實現Serializable' –

+0

是否有任何其他代碼來做到這一點? – Sathish

+0

你說你有一個通用面板,但我想你知道該面板是如何構建的?爲什麼不以同樣的方式創建一個新實例? – Kaj

回答

0

你得到錯誤的原因是因爲圖像不可序列化。你不能序列化一個圖像,但你可以做的是將圖像轉換成一個數組,然後將其序列化,然後恢復它並將其變成圖像。這裏有一個例子:

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

+0

我在JPanel內部有一個圖像,它包含2個面板,2個按鈕,1個表面即所有。 – Sathish