2015-12-06 2 views
1

Я пытаюсь сериализация Canvas экземпляра (с помощью интерфейса Serializable), на котором я нарисовал несколько пикселей, как следующий код предполагает:Сериализация Canvas в Java

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

Тогда, когда я сериализация board Безразлично» t сохранить пиксели, которые я нарисовал. Я предполагаю, что это связано с тем, что, используя getGraphics(), я не сохраняю эти пиксели в любом экземпляре, поэтому я подумал, что, возможно, вместо этого я должен рисовать с помощью метода Canvaspaint(). Будет ли сериализовать Canvas, а затем сохранить измененные пиксели? Если нет, то каковы мои варианты сохранения/сериализации Canvas с пикселями, которые я изменил? Я предполагаю, что мне пришлось бы сериализовать объект Graphics вместо Canvas? Я новичок в Java-графике, любая помощь будет с благодарностью оценена.

Чтобы быть более ясным, то, что я пытаюсь сделать, это иметь пиксели, которые я наложил на экземпляр Canvas, сохраненный в файл с использованием сериализации. Затем позже мне нужно перезагрузить этот экземпляр Canvas из сериализованного файла, который я сохранил ранее, так что, когда я его использую на экране, я вижу точные пиксели, которые я модифицировал непосредственно перед тем, как я сериализовал Canvas. Я знаю, как сериализовать объекты и все такое. Я просто не знаю, где хранятся все пиксели.

Update1:

Путь пользователь рисует что-то на экране, щелкнув левой кнопкой мыши на Canvas области. Затем MouseListener вызывает следующий метод, проходя по 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(); 
} 

ответ

1

Не сериализации холст или любые другие компоненты GUI, как вы бы сериализации «View» часть вашей программы, рискованную вещь (высокий риск исключения сериализации из-за попытки сериализации и нессериализации неэриализуемых подкомпонентов) и неэффективная вещь - сериализация больших объемов данных, которые автоматически создаются JVM и, следовательно, не требуют сериализации.

Вместо этого вы захотите сериализовать часть данных «Модель» ваших данных, ту часть, которая содержит логические данные вашей программы. Поэтому, если ваш графический интерфейс рисован с использованием данных, хранящихся в ArrayList или коллекции ArrayLists, или любых других данных, которые он принимает, затем сериализуйте эти данные. Затем обязательно создайте свой графический интерфейс, чтобы его можно было построить с использованием сериализованных данных.

Или, если вам нужно сохранить изображение, сохраните изображение, возможно, лучше всего в качестве файла png без потерь.

Кроме того, я предлагаю вам нарисовать BufferedImage, что вы затем отобразите этот BufferedImage в пределах paintComponent метод переопределения JPanel и затем сохраните и восстановите изображение. Подробнее о том, как рисовать и сохранять, пожалуйста, ознакомьтесь с этими ссылками. Первые два содержат мой код, в-третьих, из MadProgrammer-х:

+0

Программа в основном похожа на mspaint или Photoshop, позволяет пользователю рисовать все, что угодно, на 'Canvas', поэтому я не уверен, смогу ли я сериализовать модель в этом случае, если я не буду отслеживать каждый x и y координаты мыши, которую они использовали для рисования, цвет, размер кисти и т. д. Вот почему я думал, что было бы проще просто сохранить пиксели, а не все случайные шаги, которые пользователь может предпринять, чтобы что-то нарисовать. – programmar

+0

@programmar: Я сформулирую это снова наиболее решительно, потому что это правда: вы не хотите сериализовать Canvas, независимо от чего-либо, вы не хотите сериализовать его. Многое будет зависеть от того, как вы делаете свои рисунки, чего мы еще не знаем, но вы все еще можете извлечь png-изображение из нарисованного изображения и сохранить его, или если вы хотите иметь рисунок с отменой функциональности, тогда вы можете хотите сохранить коллекции изображений или точек. –

+0

@programmar: Из любопытства - почему вы используете класс AWT GUI, Canvas? Почему не компонент Swing, такой как JPanel или компонент JavaFX? –

Смежные вопросы