2012-10-12 144 views
0

我有一個我寫的擴展了JPanel的類。當程序啓動時,面板上有一個默認的繪圖(在paintComponent中實現),用戶可以在這個面板上繪圖。我試圖將整個JPanel保存到mySQL數據庫(使用BLOB),這很好,但是當我加載它時,我只能看到默認繪圖(沒有用戶輸入)。我想這是因爲圖形不可序列化,因此無法使用ObjectOutputStream進行保存。 任何想法我怎麼能保存整個事情,然後重新加載它?將JPanel保存到mySQL數據庫(Java)

我的方式JPanel中保存到數據庫:

protected byte [] convertImageToBytes() 
{  
    try 
    { 
     Connection conn = new SQLConnection("MYDB").getConnection(); 

     PreparedStatement ps=null; 
     String sql; 

     RoundTop rt = StoneGUI.getStoneTop(); //MY CUSTOM PANEL CLASS 


     ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
     ObjectOutputStream oos = new ObjectOutputStream(bos); 

     //oos.writeObject(StoneGUI.getStoneTop()); 
     oos.writeObject(rt); 
     oos.flush(); 
     oos.close(); 
     bos.close(); 


     byte [] data= bos.toByteArray(); 

     sql="UPDATE StonesDB SET image= ? WHERE lotNumber=5555;"; 
     ps=conn.prepareStatement(sql); 
     ps.setObject(1, data); 
     ps.execute(); 


     return data; 
    } 
    catch (Exception ex) 
    { 
     System.err.println(ex); 
     return null; 
    } 
+1

爲了更好地幫助您更快地發佈[SSCCE](http://sscce.org/),順便說一下BLOB,您可以使用FileIO從數據庫讀取/寫入數據庫 – mKorbel

+0

您至少應該發佈您的JPanel。 –

+0

不要試圖保存'JPanel'。在「BufferedImage」中繪製並顯示在面板中。這裏是[示例](http://stackoverflow.com/a/12683632/418556)。序列化'BufferedImage'。 –

回答

3

它來存儲面板奇怪的想法。相反,創建一個你的圖紙模型,例如繪製形狀列表並序列化模型以將其存儲在數據庫中。 然後在必須將圖形加載到面板時反序列化模型。

+0

*「繪製圖形列表並序列化模型」*不如聽起來那麼容易。我正在嘗試爲小型繪畫應用程序創建可序列化的撤消/重做。但令人驚訝的是很少有'Graphics'相關的類是可序列化的。使用'XMLEncoder''Shape'並不算太壞 - 我'只'需要獲得路徑迭代器,瀏覽元素,獲取點,纏繞規則和類型並將它們放入數據bean中。 ..umm將段的'ArrayList'轉換爲一個數組,並完成了工作,與'Stroke','RenderingHints','Paint'和'Composite'相同的基本過程看起來更棘手。 –

+0

如果你得到機會,衝浪到[此線程](http://stackoverflow.com/q/12894526/418556)其中3人顯然無法複製你的優秀代碼示例之一。 –