Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> проблема с for 
:(
    Опции темы
vikpoltav
Дата 28.1.2013, 08:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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оответственно в окне рисует так же, только первые четыре линии не ресует вообще.
вопрос почему цикл работает дважды? 

Код

import java.awt.*;
import java.awt.event.*;
public class Klass2 extends Frame{
    int x,x1,y,y1,a,b;        
    Klass2(){
        super();
    x=50;
    y=50;
    x1=50;
    y1=240;
    a=x;
    b=x1;
        setSize(400, 350);    
    setVisible(true);        
    }    
    public void paint(Graphics g ){
        g.drawLine(x,y,x1,y1);        
        for(int i=0;i<5;i++){
        a=a+20;
        b=b+20;                    
        g.drawLine(a,y,b,y1);
        System.out.println(a+"/"+b);
        }
}                        
public static void main(String args[]){
Klass2 kl=new Klass2();    
      kl.addWindowListener(new WindowAdapter(){ 
      public void windowClosing(WindowEvent ev){ 
      System.exit(0); 
      }  });}}


PM MAIL   Вверх
mbasil
Дата 29.1.2013, 14:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 399
Регистрация: 4.5.2007
Где: Москва

Репутация: 9
Всего: 13



1. Вообще то надо рисовать не на Frame, а на панели помещенной на Frame.
2. Может для упражнений лучше Swing, чем awt.
3. Такие вопросы не в этой ветви форума.

PM MAIL   Вверх
vikpoltav
Дата 29.1.2013, 18:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 28.6.2012

Репутация: нет
Всего: нет



А если рисовать на панели тогда цикл будет работать нормально?
PM MAIL   Вверх
mbasil
Дата 30.1.2013, 14:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 399
Регистрация: 4.5.2007
Где: Москва

Репутация: 9
Всего: 13



Каждый раз, когда вы заходите окно перерисовывается, а информацию
вы храните в перемнных экземпляра и их значения накапливаются.
Сам же цикл выполняется ровно столько раз, сколько запросили.
Сделайте переменные локальными.

Это сообщение отредактировал(а) mbasil - 30.1.2013, 14:11
PM MAIL   Вверх
Pawl
Дата 30.1.2013, 21:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 649
Регистрация: 22.4.2008
Где: Витебск

Репутация: 3
Всего: 28



Цитата(mbasil @  30.1.2013,  14:06 Найти цитируемый пост)
Сам же цикл выполняется ровно столько раз, сколько запросили.

Можно об этом подробнее, пожалуйста? Я имею ввиду, где в коде сабжа выполнение цикла  запрашивается второй раз? А он таки работает дважды:
Код

70/70 i = 0
90/90 i = 1
110/110 i = 2
130/130 i = 3
150/150 i = 4
170/170 i = 0
190/190 i = 1
210/210 i = 2
230/230 i = 3
250/250 i = 4

А если сделать переменные а и b локальными, вывод будет такой:
Код

70/70 i = 0
90/90 i = 1
110/110 i = 2
130/130 i = 3
150/150 i = 4
70/70 i = 0
90/90 i = 1
110/110 i = 2
130/130 i = 3
150/150 i = 4

Я с AWT мало сталкивался, и, честно говоря, тоже был удивлен такому поведению!


--------------------
В действительности всё совсем не так, как на самом деле
PM MAIL   Вверх
mbasil
Дата 31.1.2013, 08:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 399
Регистрация: 4.5.2007
Где: Москва

Репутация: 9
Всего: 13



Каждый раз, когда вы активируете окно вызывается paint().
Поэтому цикл будет вызываеться не дважды, а каждый раз, когда вы мышкой передвигаете окно, или меняете его размер. И в этой связи значения переменных экземпляра накапливаются и линии "выбрасываются" за пределы окна.
Я же писал, что надо переписать декларацию переменных так:

Код

public void paint( Graphics g ) {
        int a = x;
        int b = x1;
        g.drawLine( x, y, x1, y1 );        
        for( int i=0; i < 5; i++ ) {
          a = a + 20;
          b = b + 20;                    
          g.drawLine( a, y, b, y1 );
          System.out.println( a + "/" + b );
        }
   }


Это сообщение отредактировал(а) mbasil - 31.1.2013, 08:29
PM MAIL   Вверх
Pawl
Дата 31.1.2013, 18:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 649
Регистрация: 22.4.2008
Где: Витебск

Репутация: 3
Всего: 28



Цитата(mbasil @  31.1.2013,  08:26 Найти цитируемый пост)
Каждый раз, когда вы активируете окно вызывается paint().

Спасибо, принцип я понял. Меня интересует, почему здесь обращение к методу paint происходит именно дважды и какой участок кода за это отвечает? Т. е. где тут повторно активируется окно? К слову, если этот метод переделать, как Вы сказали, цикл for также повторяется два раза


--------------------
В действительности всё совсем не так, как на самом деле
PM MAIL   Вверх
mbasil
Дата 31.1.2013, 19:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 399
Регистрация: 4.5.2007
Где: Москва

Репутация: 9
Всего: 13



Вообще технически фрейм пересчитывается два раза, но рисоваться по идее должен один раз, когда становится видимым, то есть в момент вызова setVisible(true);.
Впрочем на нижнем уровне для фрейма используется окно операционной системы и каков там механизм внутри меня не сильно волнует. Может рисование происходит два раза потому, что в первый раз прорисовывается голый фрейм с элементами управления, а второй раз контентная панель, на которой собственно и происходит рисование. Не забывайте, что фрейм это только рамка для элементов управления, как подрамник для картины, а само содержимое фрейма невозможно на этой дыре нарисовать и для него создается контентная панель неявным образом, на которой собственно и происходит рисование всех контейнеров, а на каждом контейнере другие контейнеры  и т.д. до атомарных элементов. 
Я знаю, что рисовать надо на панели, а не на фрейме и этого мне хватает. Исходные коды Java открыты, можете почитать и порыть "до самой глины", а надо? Есть более интересные задачи.  

Это сообщение отредактировал(а) mbasil - 31.1.2013, 19:14
PM MAIL   Вверх
Pawl
Дата 31.1.2013, 19:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 649
Регистрация: 22.4.2008
Где: Витебск

Репутация: 3
Всего: 28



Цитата(mbasil @  31.1.2013,  19:08 Найти цитируемый пост)
Вообще технически фрейм пересчитывается два раза, но рисоваться по идее должен один раз, когда становится видимым, то есть в момент вызова setVisible(true);

Похоже, тут-то и собака порылась! Если убрать setVisible(true), for не выполняется ни разу. Что же, ответ я кажись получил, ловите +!


--------------------
В действительности всё совсем не так, как на самом деле
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.0759 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.