![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| Chupakabr |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 3.12.2008 Репутация: нет Всего: нет |
Есть следующий кусок кода, который, как я понимаю, не работает от того, что рисование происходит в компоненте, и только затем он добавляется к фрейму. Проблема в том, что в методе paintComponent находится бесконечный цикл и соответственно после входа в него управление больше не передаётся фрейму(он зависает). Как рисовать в уже визуализированном фрейме?
Это сообщение отредактировал(а) Chupakabr - 19.1.2010, 18:13 |
|||
|
||||
| jk1 |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1168 Регистрация: 17.10.2008 Где: Санкт-Петербург Репутация: 21 Всего: 75 |
Вот пример рисования на видимом компоненте на основе вашего кода. Думаю, принцип понятен
-------------------- Opinions are like assholes — everybody has one |
||||
|
|||||
| Chupakabr |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 3.12.2008 Репутация: нет Всего: нет |
Это вариант, но если, скажем, после нажатия кнопки, я хочу видеть как во фрейме/компоненте появляются новые квадратики или линии до тех пор, пока я не нажму кнопку "стоп". При таком раскладе добавление объектов (Rectangle/Line2D, которых может накопится несколько тысяч) в ArrayList и последующая перерисовка не есть делом благодарным.
Как по мне, сама концепция заполнения компонента с последующим добавлением во фрейм не позволяет осуществить бесконечный цикл. Может есть другие пути? |
|||
|
||||
| jk1 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1168 Регистрация: 17.10.2008 Где: Санкт-Петербург Репутация: 21 Всего: 75 |
Есть и другие варианты: создаете Image, рисуете в нем. Вот пример
И никаких ArrayList'ов) -------------------- Opinions are like assholes — everybody has one |
|||
|
||||
| Chupakabr |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 3.12.2008 Репутация: нет Всего: нет |
Вроде как должно работать. Для интереса заключил строчки 21-23 вашего кода в while(true), но, при нажатии кнопки, фрейм всё равно виснет.
Это сообщение отредактировал(а) Chupakabr - 20.1.2010, 20:30 |
|||
|
||||
| jk1 |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1168 Регистрация: 17.10.2008 Где: Санкт-Петербург Репутация: 21 Всего: 75 |
И будет виснуть, если использовать бесконечный цикл. Вы этим циклом останавливаете процесс отрисовки навсегда. В правильно построенном Swing-приложении отрисовка компонет и обработка событий выполняются в едином потоке, называемом EDT. Если вы хотите что-то выполнять параллельно (например генерировать новые графические примитивы и добавлять их на компонет) - нужно организовать отдельный поток. Удобно использовать для этой цели таймеры:
-------------------- Opinions are like assholes — everybody has one |
||||
|
|||||
| Chupakabr |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 3.12.2008 Репутация: нет Всего: нет |
Но если Timer работает в отдельном (рабочем, стало быть) потоке, то и прорисовка происходит там же: обработчик отвечающий за оную прицеплен именно к нему. Или я ошибаюсь?
|
|||
|
||||
| jk1 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1168 Регистрация: 17.10.2008 Где: Санкт-Петербург Репутация: 21 Всего: 75 |
Ошибаетесь. Из javaDoc на таймер:
-------------------- Opinions are like assholes — everybody has one |
|||
|
||||
| Chupakabr |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 3.12.2008 Репутация: нет Всего: нет |
С потоками вроде как разобрался и появились новые вопросы: в следующем коде при добавлении компонента Comp во фрейм, метод paintComponent почему-то вызывается дважды.
Это сообщение отредактировал(а) Chupakabr - 8.2.2010, 23:46 |
|||
|
||||
| jk1 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1168 Регистрация: 17.10.2008 Где: Санкт-Петербург Репутация: 21 Всего: 75 |
Насколько мне известно, метод paintCmponent() будет вызван каждый раз, когда необходимо перерисовать окно. Происходить это может по разным причинам, поэтому общая рекомендация такая: пишите код отрисовки так, чтобы он не зависел от количества вызовов метода и в любой момент предоставлял адекватные данные для рисования.
И не забывайте вызывать super.paintComponent(g);. -------------------- Opinions are like assholes — everybody has one |
|||
|
||||
![]()
|
| Правила форума "Java" | |
|
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, jk1. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Java: GUI и Java FX приложения | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |