Шаблон команды для отмены / повтора в приложении рисования

Я хотел бы реализовать отмену / повтор в небольшомнанесение краски, КажетсяШаблон команды хорошо подходит для использования, но я не уверен, как лучше всего это реализовать.

Как я понимаю шаблон, необходимо включить в каждую команду:

Детали операции рисования для повторного выполнения (например, Линия -> Начните & конечные точки, линия произвольной формы -> )GeneralPathСостояние компонента до изменения отмены. В этом случае это будет небольшой снимок области, на которую воздействует команда.

На основании этого я понимаю, что каждая команда должна бытьатомное» или самодостаточный, со всей информацией, необходимой для отмены / повторения этой операции.

К сожалению, для этого потребуется хранить больше информации, чем яЯ сначала ожидал. Для линии мы также должны учитывать такие вещи, как,ColorStroke а такжеRenderingHints рисовал изначально. Это превращает моюпростые маленькие команды во что-то ... более громоздкое в памяти, и с большим количеством кода котельной пластины для производства (каждый будет сериализуемым bean1).

Из соображений сохранения памяти (в основном) я хотелобмануть» на спецификации команд. Возможно, при каждом 100-м обновлении делайте резервную копию всей области рисования, но в противном случае не сохраняйте часть измененного изображения и просто перестраивайте последние (до) 100 команд для каждой новой операции рисования. Но это кажется проблематичным, чтобы гарантировать, что состояниеGraphics Объект находится прямо перед окраской каждой части - эта часть может потребовать линии, ноRenderingHints были изменены 4 команды назад,Color было изменено 98 команд назад, в то время какStroke остался прежним для последних 227 команд.

Преследование более эффективной команды памяти, кажется, выбрасывает шаблон прямо в окно с точки зренияатомное», Это, в свою очередь, приводит к трудностям при определении самой ранней команды, которая может повлиять на рендеринг.

Нужно ли мне:

Ищите новую модель?Попытаться реализовать мои особые потребности путем настройки шаблона?Бросить все это в мусорное ведро как преждевременную оптимизацию и закодировать это самым простым (и наиболее потребляющим память) способом, который придерживается шаблона команды, как определено?Обновить"каждый будет сериализуемым бобом На 2 мысли нет. Я сделал проверку купола, чтобы найти, чтоGraphics2D (который аккуратно инкапсулирует многие параметры, используемые при рисовании) не сериализуем. Далее,BasicStroke является Сериализуется, но толщина обводки не сохраняется. Я мог бы создать сериализуемые версии многих атрибутов, но это, кажется, делает для намного большего кода, поэтому я 'Я собираюсь отказаться от этой спецификации. также. Я буду только пытаться сохранить ссылку наBufferedImage во время выполнения.

Ответы на вопрос(2)

Ваш ответ на вопрос