簡體   English   中英

用Java序列化Canvas對象

[英]Serializing Canvas objects in Java

我正在嘗試序列Serializable我在其上繪制了一些像素的Canvas實例(使用Serializable接口),如以下代碼所示:

Canvas board = new Canvas();
Graphics g = board.getGraphics();
g.setColor(Color.BLACK);
g.drawString("txt", 10, 20);
g.dispose();

然后,當我對board序列化時,它不會保存我繪制的像素。 我猜這是因為使用getGraphics()沒有將那些像素保存到任何實例,所以我認為也許應該改用Canvaspaint()方法進行paint() 是否會序列化Canvas然后保存修改后的像素? 如果沒有,我使用已修改的像素保存/序列化Canvas選項是什么? 我猜我將不得不序列化Graphics對象而不是Canvas 我是Java圖形的新手,將不勝感激。

更清楚地說,我要嘗試的是使用序列化將我在Canvas實例上放置的像素保存到文件中。 然后,稍后我需要從之前保存的序列化文件中重新加載此Canvas實例,以便在屏幕上使用它時,可以看到在序列化Canvas之前完全修改過的像素。 我知道如何序列化對象等等。 我只是不清楚所有像素存儲在哪里。

UPDATE1:

用戶在屏幕上繪制內容的方式是通過在“ Canvas區域上單擊鼠標左鍵。 然后, MouseListener調用以下方法,並傳遞指定鼠標xy的Point對象:

private void drawAt(Point p)
{
    Graphics g = board.getGraphics();
    g.setColor(brushColor);
    g.setFont(brushFont);
    g.drawString(brushText, p.x, p.y);
    g.dispose();
}

不要序列化Canvas或任何其他GUI組件,因為要序列化程序的“視圖”部分,這是一件危險的事情(由於嘗試序列化和反序列化不可序列化的子組件而導致序列化異常的高風險)並且效率低下要做的事情-序列化由JVM自動生成的大量數據,因此不需要序列化。

相反,您將需要序列化數據的“模型”部分,該部分保存了程序的邏輯數據。 因此,如果您的GUI是使用ArrayList或ArrayList的集合或所需要的任何數據繪制的,則對這些數據進行序列化。 然后,請確保創建您的GUI,以便可以使用序列化數據進行構建。

或者,如果您需要存儲圖像,則存儲圖像,最好將其存儲為無損png文件。

另外,我建議您繪制一個BufferedImage,然后在paintComponent方法重寫中顯示該BufferedImage,然后保存並還原該圖像。 有關如何繪制和保存的更多信息,請查看這些鏈接。 前兩個包含我的代碼,第三個是MadProgrammer的代碼:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM