| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Java EE (J2EE) и Spring > проблема с for |
| Автор: vikpoltav 28.1.2013, 08:58 | ||
| Доброго временм суток. Помогите разобраться, я совсем новичок, заранее благодарен. Вот,что выводит на консоль,значение а/значение b: 70/70 90/90 110/110 130/130 150/150 170/170 190/190 210/210 230/230 250/250 Cоответственно в окне рисует так же, только первые четыре линии не ресует вообще. вопрос почему цикл работает дважды?
|
| Автор: mbasil 29.1.2013, 14:29 |
| 1. Вообще то надо рисовать не на Frame, а на панели помещенной на Frame. 2. Может для упражнений лучше Swing, чем awt. 3. Такие вопросы не в этой ветви форума. |
| Автор: vikpoltav 29.1.2013, 18:31 |
| А если рисовать на панели тогда цикл будет работать нормально? |
| Автор: mbasil 30.1.2013, 14:06 |
| Каждый раз, когда вы заходите окно перерисовывается, а информацию вы храните в перемнных экземпляра и их значения накапливаются. Сам же цикл выполняется ровно столько раз, сколько запросили. Сделайте переменные локальными. |
| Автор: Pawl 30.1.2013, 21:32 | ||||
Можно об этом подробнее, пожалуйста? Я имею ввиду, где в коде сабжа выполнение цикла запрашивается второй раз? А он таки работает дважды:
А если сделать переменные а и b локальными, вывод будет такой:
Я с AWT мало сталкивался, и, честно говоря, тоже был удивлен такому поведению! |
| Автор: mbasil 31.1.2013, 08:26 | ||
| Каждый раз, когда вы активируете окно вызывается paint(). Поэтому цикл будет вызываеться не дважды, а каждый раз, когда вы мышкой передвигаете окно, или меняете его размер. И в этой связи значения переменных экземпляра накапливаются и линии "выбрасываются" за пределы окна. Я же писал, что надо переписать декларацию переменных так:
|
| Автор: Pawl 31.1.2013, 18:13 |
Спасибо, принцип я понял. Меня интересует, почему здесь обращение к методу paint происходит именно дважды и какой участок кода за это отвечает? Т. е. где тут повторно активируется окно? К слову, если этот метод переделать, как Вы сказали, цикл for также повторяется два раза |
| Автор: mbasil 31.1.2013, 19:08 |
| Вообще технически фрейм пересчитывается два раза, но рисоваться по идее должен один раз, когда становится видимым, то есть в момент вызова setVisible(true);. Впрочем на нижнем уровне для фрейма используется окно операционной системы и каков там механизм внутри меня не сильно волнует. Может рисование происходит два раза потому, что в первый раз прорисовывается голый фрейм с элементами управления, а второй раз контентная панель, на которой собственно и происходит рисование. Не забывайте, что фрейм это только рамка для элементов управления, как подрамник для картины, а само содержимое фрейма невозможно на этой дыре нарисовать и для него создается контентная панель неявным образом, на которой собственно и происходит рисование всех контейнеров, а на каждом контейнере другие контейнеры и т.д. до атомарных элементов. Я знаю, что рисовать надо на панели, а не на фрейме и этого мне хватает. Исходные коды Java открыты, можете почитать и порыть "до самой глины", а надо? Есть более интересные задачи. |