2012-10-12 64 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人显然无法复制你的优秀代码示例之一。 –