|
0 / 0 / 0
Регистрация: 01.09.2020
Сообщений: 5
|
|||||||||||||||||||||
Repaint в Java01.09.2020, 19:29. Показов 897. Ответов 9
Здравствуйте, возникла следующая проблема.
Есть класс SimpleGui
Метод go делает следующие вещи:
У класса SimpleGui есть 3и внутренних класса
Цель - создать анимацию, с перемещением фигур из исходного положения. Это получается сделать, если совсем не использовать метод moveFigures(). А код этого метода просто вставить в конец метода go. Но тогда анимация начинается при запуске программы. А хочется, чтобы это происходило после нажатия на кнопку. Если в методе moveFigures() убрать цикл, то после нажатия на кнопку происходит смещение фигур на 1 пиксель (ни о какой анимации речи нет, потому что 200 раз кликать на клавишу еще то удовольствие). Но как только появляется цикл, причем неважно for/while, то происходит следующее: программа ненадолго зависает, а потом рисует фигуры в конечной точке, пропуская всю анимацию движения. Может кто-нибудь может помочь?)
0
|
|||||||||||||||||||||
| 01.09.2020, 19:29 | |
|
Ответы с готовыми решениями:
9
Repaint() не выполяется Jframe repaint
|
|
296 / 149 / 67
Регистрация: 22.02.2017
Сообщений: 592
|
||||||
| 02.09.2020, 08:14 | ||||||
|
То есть столько букв ради того что бы сдвинуть фигуру ? Да и все в корне неправильно делаете, взять туже вставленную графику в JLabel, запомните никогда не суйте графику в компоненты если они участники потока, почему спросите вы, при таком раскладе вы теряете до 20% производительности потока так надо и компонент таскать и постоянно его перерисовывать. Держите всю графику в bitmap. Ну и по вашему коду просто мое замечание зачем его так дико дробить на классы он что быстрее станет или удобней от того что вы его кусками расписываете ? В чем смысл ваших классов если они не универсальны и ваш код просто распилен на бобышки.
Ну а по поводу движения, посмотрите к примеру вот это (ваш код ковырять не буду простите, такое дробление мне чуждо, например как я пишу классы - движок игры одно полотно, класс диалоги, класс музыка. А пилить код на куски нет уж извольте):
0
|
||||||
|
0 / 0 / 0
Регистрация: 01.09.2020
Сообщений: 5
|
|
| 02.09.2020, 11:41 [ТС] | |
|
Да, все верно, мне потребовалось именно столько "букв", чтобы описать свою проблему. К сожалению ответ на нее я не услышал. Спасибо за совет с графикой, он действительно может пригодиться. Такое количество классов обусловлено тем, что у меня 2е кнопки, для которых реализован свой Listener. Как вы предлагаете его реализовать в одном классе, я , простите не понимаю. К тому же ваш код не содержит ни одной кнопки, не говоря уже о действиях после нажатия на нее. Если вы внимательно прочтете мой вопрос, то увидите, что проблема не в том, чтобы просто сделать анимацию при запуске. Проблема в том, чтобы это работало, после нажатия на клавишу.
Добавлено через 40 минут Повторюсь, если метод moveFigures() вынести в метод go(). При запуске программы сработает анимация. Все будет так, как нужно. Если же метод moveFigures() вызывать после нажатия на кнопу, то он будет отрабатывать, будут выводы на консоль и звук, но самой анимации не будет. Программа словно зависнет, (на самом деле она просто будет идти по циклу), а потом покажет изображение в конечной точке. Мне не ясно почему так? И как это исправить?
0
|
|
|
296 / 149 / 67
Регистрация: 22.02.2017
Сообщений: 592
|
|
| 02.09.2020, 11:57 | |
|
white_, Опишите вашу задачу (без вашего кода), а именно что вы хотите получить - 2 кнопки что они должны делать ? что (треугольник, квадрат, круг, спрайт) куда двигаем.
В ваш код не хочется лезть хотя бы потому что вы таймер загнали в цикл что просто дикость.
0
|
|
|
0 / 0 / 0
Регистрация: 01.09.2020
Сообщений: 5
|
|
| 02.09.2020, 13:42 [ТС] | |
|
Если упростить и оставить интересующие моменты, то вот: cоздаем несколько фигур (1/2/3 - неважно). Закрашиваем. Создаем 2е кнопки (вторая потребуется позже, но пока она ничего не должна делать). Фигуры движутся вниз экрана, меняя свой цвет, после нажатия на 1ую кнопку. P.S. я очень извиняюсь, но не могли бы вы объяснить почему нельзя ставить таймер в цикле. Просто в вашем коде происходит именно это, причем еще и в бесконечном цикле. (В цикле while(true))
Добавлено через 1 час 33 минуты Если это будет кому-то интересно,то вот здесь описана моя проблема и ее решение. https://coderoad.ru/23244522/J... о-один-раз Большое спасибо, за уделенное время.
0
|
|
|
296 / 149 / 67
Регистрация: 22.02.2017
Сообщений: 592
|
||
| 02.09.2020, 13:44 | ||
|
white_, у меня не бесконечный цикл а поток-демон, у вас цикл внутри которого таймер который создается заданное количество раз в цикле без его завершения. Иными словами вы создаете новый таймер с каждым движением
0
|
||
|
0 / 0 / 0
Регистрация: 01.09.2020
Сообщений: 5
|
||||||||||||||||
| 02.09.2020, 14:27 [ТС] | ||||||||||||||||
|
Здесь важно вот это:
"Метод repaint не перекрашивает сразу, вместо этого он отмечает панель, которую нужно перекрасить как можно скорее (но не прямо сейчас). Swing не использует потоки, так что только вещь может работать одновременно. Есть много задач, которые Swing выполняет за кулисами, между вызовами ваших слушателей, и одна из этих задач-перекраска windows, которую нужно перекрасить. Swing не будет перерисовывать окно во время работы вашего прослушивателя. Кроме того, даже если repaint перекрасится немедленно, анимация произойдет слишком быстро, чтобы кто-то заметил." А я пытался сделать именно так - вызвать repaint() в цикле. Очень странно, что без нажатия на кнопку это получалось. Сейчас я делаю так:
И программа работает так, как я хотел. На счет таймера, который создавался на каждом шаге цикла, то это действительно было глупо. (Надеюсь сейчас timer.restart() работает верно. Если нет, напишите пожалуйста). Поток -демон для меня пока нечто неизвестное, думаю, будет следующей темой с которой я начну разбираться. Если у вас есть еще замечания, с удовольствием их выслушаю. P.S. Спасибо за терпение. Добавлено через 15 минут
0
|
||||||||||||||||
|
296 / 149 / 67
Регистрация: 22.02.2017
Сообщений: 592
|
||||||
| 02.09.2020, 15:09 | ||||||
|
как вижу решение вашей задачи я, судя по вашему описанию (или вы хотите последовательно цвет менять ?)
0
|
||||||
|
296 / 149 / 67
Регистрация: 22.02.2017
Сообщений: 592
|
|
| 02.09.2020, 15:18 | |
|
white_, и заметьте, в коде нет ни одного repaint(); XD
поток можно и таймером заменить, хватит одна штука на все
0
|
|
|
0 / 0 / 0
Регистрация: 01.09.2020
Сообщений: 5
|
|
| 02.09.2020, 17:00 [ТС] | |
|
Огромное вам спасибо
0
|
|
| 02.09.2020, 17:00 | |
|
Помогаю со студенческими работами здесь
10
Медленная функция repaint()
Не работает repaint с задержкой Перерисовка JFrame. Не работает repaint(); Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2.
Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
|
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
|
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
|
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2.
Данный документ берёт данные из другого нетипового документа. . .
|
|
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
|
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2.
Задача: реализовать программный контроль на предмет проведения документа. . .
|
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2.
Задача:
1. Реализовать контроль заполнения реквизита. . .
|
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение:
DISM / Online / Add-Capability / CapabilityName:WMIC~~~~
Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
|