![]() |
Модераторы: LSD, AntonSaburov |
![]() ![]() ![]() |
|
vikpoltav |
|
|||
Новичок Профиль Группа: Участник Сообщений: 2 Регистрация: 28.6.2012 Репутация: нет Всего: нет |
Доброго временм суток.
Помогите разобраться, я совсем новичок, заранее благодарен. Вот,что выводит на консоль,значение а/значение b: 70/70 90/90 110/110 130/130 150/150 170/170 190/190 210/210 230/230 250/250 Cоответственно в окне рисует так же, только первые четыре линии не ресует вообще. вопрос почему цикл работает дважды?
|
|||
|
||||
mbasil |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 399 Регистрация: 4.5.2007 Где: Москва Репутация: 9 Всего: 13 |
1. Вообще то надо рисовать не на Frame, а на панели помещенной на Frame.
2. Может для упражнений лучше Swing, чем awt. 3. Такие вопросы не в этой ветви форума. |
|||
|
||||
vikpoltav |
|
|||
Новичок Профиль Группа: Участник Сообщений: 2 Регистрация: 28.6.2012 Репутация: нет Всего: нет |
А если рисовать на панели тогда цикл будет работать нормально?
|
|||
|
||||
mbasil |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 399 Регистрация: 4.5.2007 Где: Москва Репутация: 9 Всего: 13 |
Каждый раз, когда вы заходите окно перерисовывается, а информацию
вы храните в перемнных экземпляра и их значения накапливаются. Сам же цикл выполняется ровно столько раз, сколько запросили. Сделайте переменные локальными. Это сообщение отредактировал(а) mbasil - 30.1.2013, 14:11 |
|||
|
||||
Pawl |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 649 Регистрация: 22.4.2008 Где: Витебск Репутация: 3 Всего: 28 |
Можно об этом подробнее, пожалуйста? Я имею ввиду, где в коде сабжа выполнение цикла запрашивается второй раз? А он таки работает дважды:
А если сделать переменные а и b локальными, вывод будет такой:
Я с AWT мало сталкивался, и, честно говоря, тоже был удивлен такому поведению! -------------------- В действительности всё совсем не так, как на самом деле |
||||
|
|||||
mbasil |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 399 Регистрация: 4.5.2007 Где: Москва Репутация: 9 Всего: 13 |
Каждый раз, когда вы активируете окно вызывается paint().
Поэтому цикл будет вызываеться не дважды, а каждый раз, когда вы мышкой передвигаете окно, или меняете его размер. И в этой связи значения переменных экземпляра накапливаются и линии "выбрасываются" за пределы окна. Я же писал, что надо переписать декларацию переменных так:
Это сообщение отредактировал(а) mbasil - 31.1.2013, 08:29 |
|||
|
||||
Pawl |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 649 Регистрация: 22.4.2008 Где: Витебск Репутация: 3 Всего: 28 |
Спасибо, принцип я понял. Меня интересует, почему здесь обращение к методу paint происходит именно дважды и какой участок кода за это отвечает? Т. е. где тут повторно активируется окно? К слову, если этот метод переделать, как Вы сказали, цикл for также повторяется два раза -------------------- В действительности всё совсем не так, как на самом деле |
|||
|
||||
mbasil |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 399 Регистрация: 4.5.2007 Где: Москва Репутация: 9 Всего: 13 |
Вообще технически фрейм пересчитывается два раза, но рисоваться по идее должен один раз, когда становится видимым, то есть в момент вызова setVisible(true);.
Впрочем на нижнем уровне для фрейма используется окно операционной системы и каков там механизм внутри меня не сильно волнует. Может рисование происходит два раза потому, что в первый раз прорисовывается голый фрейм с элементами управления, а второй раз контентная панель, на которой собственно и происходит рисование. Не забывайте, что фрейм это только рамка для элементов управления, как подрамник для картины, а само содержимое фрейма невозможно на этой дыре нарисовать и для него создается контентная панель неявным образом, на которой собственно и происходит рисование всех контейнеров, а на каждом контейнере другие контейнеры и т.д. до атомарных элементов. Я знаю, что рисовать надо на панели, а не на фрейме и этого мне хватает. Исходные коды Java открыты, можете почитать и порыть "до самой глины", а надо? Есть более интересные задачи. Это сообщение отредактировал(а) mbasil - 31.1.2013, 19:14 |
|||
|
||||
Pawl |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 649 Регистрация: 22.4.2008 Где: Витебск Репутация: 3 Всего: 28 |
Похоже, тут-то и собака порылась! Если убрать setVisible(true), for не выполняется ни разу. Что же, ответ я кажись получил, ловите +! -------------------- В действительности всё совсем не так, как на самом деле |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Java" | |
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |