![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| lilyam |
|
||||||||
|
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 13.10.2010 Репутация: нет Всего: нет |
Приветствую!
Вот решил поработать с 2d графикой, начал с книги Developing Games in Java от David Brackeen. В первых главах в книге представлен класс для работы в полноэкранном режиме с использованием Full-Screen Exclusive Mode: http://pastie.org/1753701. Для анимации я решил воспользоваться классом javax.swing.Timer: расширил класс ScreenManager(http://pastie.org/1753701) внутренним классом, который реализует, соответственно, интерфейс ActionListener:
При вызове метода getFullScreenWindow получаю null. Почему? Тестовый класс:
Откуда видно, что прежде чем запустить метод setFullScreen инициализируется объект типа ScreenManager, с полями которого и работает листенёр(классса ScreenListener). но когда выполняется метод actionPerformed, запущенный после создания листенёра и старта таймера, getFullScreenWindow возвращает ноль, что говорит о том, что режим не полноэкранный:
, хотя он был установлен методом setFullScreen:
Это сообщение отредактировал(а) lilyam - 4.4.2011, 20:22 |
||||||||
|
|||||||||
| lilyam |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 13.10.2010 Репутация: нет Всего: нет |
Замечу, если использовать обычное прерывание текущего потока, то всё работает
|
|||
|
||||
| jk1 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1168 Регистрация: 17.10.2008 Где: Санкт-Петербург Репутация: 21 Всего: 75 |
Я не совсем понял, что Вы называете "перыванием текущего потока", так как вызова метода interrupt() в Вашем коде нет.
Тем не менее попытаюсь объяснить происходящее. На самом деле тут учавствуют три потока: 1. начальный, в котором запускается метод main() 2. поток, в котором ждут таймеры 3. EDT, в котором, как следует из документации, всегды выполняются действия javax.swing.Timer. Вы запускаете таймер с очень маленькой начальной задержкой, он срабатывает на EDT и к этому времени асинхронная установка графического режима просто не успевает отработать. Но начальная задержка при запуске таймера - это плохой выход, ведь на разных машинах на смену графического режима может уйти разное количество времени. Вот небольшой фикс, который проблему решает:
Как видите, он просто пропускает несколько первых тактов до тех пор, пока полноэкранный режим не будет поинициализирован до конца. Правда анимации все равно не получается, ведь начальный поток быстро завершает свое выполнение и возвращает прежний режим. Тут уже двумя строчками все не поправишь, нужно организовывать нормальное управление потоками Вашего приложения. Это сообщение отредактировал(а) jk1 - 5.4.2011, 14:49 -------------------- Opinions are like assholes — everybody has one |
|||
|
||||
| lilyam |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 13.10.2010 Репутация: нет Всего: нет |
to jk1
Т.е. нужно работать, как вы написали, с тремя потоками: главный, поток, в котором ожидает таймер и EDT-поток, в котором выполняется actionPerformed, правильно я вас понимаю? А как мне получить ссылки на две последней нити? А можно ли использовать SwingWorker: перевести дисплей в полноэкранный режим в doInBackground в связке с done и get, как только был установлен необходимый графический режим, оповестить EDT, и только после этого запустить таймер? С SwingWorker заработало:
Спасибо, за отклик. Думаю, вопросы ещё появятся) Это сообщение отредактировал(а) lilyam - 10.4.2011, 21:43 |
|||
|
||||
| lilyam |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 13.10.2010 Репутация: нет Всего: нет |
to jk1
А вот собственно и вопросы) Почему-то keyListener не работает: в отладчике при нажатии любой клавиши должен забегать в keyPressed, но нажатие игнорируется. И не перерисовывается должным образом дата, вместо этого текущую дату рисует за место прошлой, не затирая заранее последнюю. Никаких ошибок не выдает по окончанию работы. Хелп |
|||
|
||||
![]()
|
| Правила форума "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. |