Немного не по теме, но у меня было несколько неудобных минут, потому что я использовал update () вместо repaint ().Я советую всем, кто работает с SWING, потратить некоторое время на проверку того, какие методы должны обрабатываться как потокобезопасные, а какие должны быть в EDT (потоке диспетчера событий), чтобы избежать неожиданных ошибок. Это хорошая статья об этом.
Кроме того, вначале продумайте, хотите ли вы иметь систему отмены / возврата в вашем приложении ... Если так, то сколько шаговВы хотите разрешить быть снятым.Если вы хотите разрешить эту функцию, вы не можете просто нарисовать и забыть о том, что рисовали в прошлый раз.Также было бы не эффективно использовать память для хранения всех изображений, которые вы рисуете.Я не эксперт, и я не говорю, что это лучшая практика, но я бы пошел по этому пути:
Я бы сделал два списка.
- Один из них будет хранить примененные действия рисования ,
- другие будут содержать отмененные действия рисования .
действие рисования будетбыть интерфейсом, и некоторый класс будет реализовывать его для каждого конкретного типа действия рисования (LineDrawAction, CirceDrawAction ...).
Когда вы рисуете новую линию или что-либо еще, вы очищаете список отмененных действий и добавляете его в список прикладных действий .Когда кто-то отменяет последнее действие, я просто удаляю последние действия рисования из примененного списка и добавляю в отозванный список (и т. Д.).В зависимости от того, хотите ли вы, чтобы только последнее действие x было отменено, когда список достигает этого ограничения x, я бы удалил первое действие рисования из списка или очереди и, наконец, обратился бы к изображению - это означает постоянное рисование, и это не может бытьотменить.
Надеюсь, это понятно и полезно, даже если не прямой ответ на ваш вопрос.