paintComponent() та setLocation()
Розробка настільних програм на я. /
Доброго вам дня.
Спробував реалізувати наступне: є вікно всередині якого одне єдине зображення - картинка, що завантажується з диска. Потрібно щоб малюнок мене своє місце положення при натисканні мишкою в будь-якому місці вікна.
Код компілюється та працює. Але картинка не переміщається у нове місце, а копіюється у нове місце. Як я зрозумів - метод paintComponent не перемальовує зображення - а щоразу створює нове. І ось питання - при викликі setLocation() викликається метод paintComponent()? Чи перемалювання зображення здійснюється якось інакше?
а) Вільне малювання рекомендується робити виключно на java.awt.Canvas який саме для цього призначений. У тому числі специфічно для нього розробленим подвійним буферуванням через BufferStrategy (4) б) не рекомендується змішувати різний функціонал в одному класі, як тут у тебе клас Animation є і панеллю і MouseListener. перевизначати виключно тобі потрібні методи. г) замість завантажуваних картинок малюй щось на зразок градієнтних розмальовок. тоді твій приклад можна скопіювати і миттєво запустити.
Наведений приклад нижче:
І другий приклад, вже на Canvas із подвійним буферуванням:
Подвійне буферування необхідно, якщо ти хочеш досягти анімації без мерехтіння фону. Я не став реалізовувати подвійне буферування через BufferStrategy, замість цього зробив два малюнки: а) gradientImage - це картинка, яка рухається. б) transitionImage - це вже картинка за розмірами полотна.
Коли треба перемалювати, перевизначається update() (він у канвасу все очищає, і потім викликається paint(), а нам очищення не потрібне),який у нас просто викликає paint().
paint() дивиться, чи змінилися розміри полотна, якщо так - перетворює transitionImage, і дивиться, чи змінилося положення gradientImage, і якщо так, малює спочатку transitionImage, а потім його просто переносить на полотно.
таким чином ліквідується мерехтіння полотна.
upd2. Дивись ефект мерехтіння (Щоб його позбутися, потрібно розкоментувати update()):