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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Кто и где закрашивает старый овал, Вопрос новичка :о) 
V
    Опции темы
Prol
Дата 11.1.2008, 13:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 11.1.2008
Где: Кыев, Украина

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



Этот апплет рисует красный овал там, где нажимается мышка.

Но мне непонятно, кто и где закрашивает старый овал в цвет фона?
Я не люблю, когда программы делают то, чего я их не прошу. В тексте апплета есть как рисуется новый овал, но нету как затирается старый овал :о)

Код

import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;

public class ClickMe extends Applet implements MouseListener {
    private Spot spot = null;
    private static final int RADIUS = 7;

    public void init() {
     addMouseListener(this);
    }

    public void paint(Graphics g) {
     //draw a black border and a white background
     g.setColor(Color.blue);
     g.fillRect(0, 0, getSize().width - 1, getSize().height - 1);
     g.setColor(Color.black);
     g.drawRect(0, 0, getSize().width - 1, getSize().height - 1);

     //draw the spot
     g.setColor(Color.red);
     if (spot != null) {
         g.fillOval(spot.x - RADIUS, spot.y - RADIUS, RADIUS * 2, RADIUS * 2);
        }
    }

    public void mousePressed(MouseEvent event) {   
     if (spot == null) {
         spot = new Spot(RADIUS);
     }
     spot.x = event.getX();
     spot.y = event.getY();
     repaint();
    }

    public void mouseReleased(MouseEvent event) {}
    public void mouseClicked(MouseEvent event) {}
    public void mouseEntered(MouseEvent event) {}
    public void mouseExited(MouseEvent event) {}
}

public class Spot {
    public int size;
    public int x, y;
  
    public Spot(int intRadius) {
        size = intRadius;
        x = -1;
        y = -1;
    }
}


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


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1801
Регистрация: 25.4.2006

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



Код

g.fillRect(0, 0, getSize().width - 1, getSize().height - 1);

а это по твоему что?!
PM MAIL ICQ   Вверх
Prol
Дата 11.1.2008, 14:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 11.1.2008
Где: Кыев, Украина

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



Цитата(Platon @ 11.1.2008,  14:09)
Код

g.fillRect(0, 0, getSize().width - 1, getSize().height - 1);

а это по твоему что?!

Если это закомментировать, то всё равно старый овал кто-то затирает :о)
PM MAIL WWW ICQ   Вверх
Metal_Heart
Дата 11.1.2008, 14:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


а почему бы и нет?
**


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

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



Prol,  smile 

Вот ответ на твой вопрос:
Код

 repaint();

Ты же не хранишь ранее нарисованные фигуры? Нет? А кто это должен делать?
Цитата(Prol @  11.1.2008,  13:49 Найти цитируемый пост)
Я не люблю, когда программы делают то, чего я их не прошу.

Вот они и не стали этого реализовывать


--------------------
 не стыдно учиться, а стыдно не учиться 
PM ICQ   Вверх
Prol
Дата 11.1.2008, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 11.1.2008
Где: Кыев, Украина

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



Цитата(Metal_Heart @ 11.1.2008,  14:28)
Prol,  smile 

Вот ответ на твой вопрос:
Код

 repaint();

Ты же не хранишь ранее нарисованные фигуры? Нет? А кто это должен делать?

Нипанятнаааа...

Как сделать так, чтобы "кто-то" не затирал старый овал, если его об этом не прошу?

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


а почему бы и нет?
**


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

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



Цитата(Prol @  11.1.2008,  14:33 Найти цитируемый пост)
Как сделать так, чтобы "кто-то" не затирал старый овал, если его об этом не прошу?


Prol, ну пойми ты наконец, что пока ты САМ не позаботишься о сохранении своих данный их никто хранит не будет!!!

А чтоб тебе сохранить свои овалы - создаешь промежуточный буффер, типа Image - кажется.
Рисуешь в нем, затем при repaint() выводишь на экран.

У этого метода есть ещё несколько побочных плюсов ...


--------------------
 не стыдно учиться, а стыдно не учиться 
PM ICQ   Вверх
batigoal
Дата 11.1.2008, 14:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


Профиль
Группа: Участник Клуба
Сообщений: 6423
Регистрация: 28.12.2004
Где: Санктъ-Петербургъ

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



Prol, при reapint происходит полная перерисовка. Если тебе нужно, чтобы при этом рисовались ещё и старые изображения, тебе придется самому об этом позаботиться.


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
Prol
Дата 11.1.2008, 14:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 11.1.2008
Где: Кыев, Украина

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



Цитата(Metal_Heart @ 11.1.2008,  14:39)
Prol, ну пойми ты наконец, что пока ты САМ не позаботишься о сохранении своих данный их никто хранит не будет!!!

А чтоб тебе сохранить свои овалы - создаешь промежуточный буффер, типа Image - кажется.
Рисуешь в нем, затем при repaint() выводишь на экран.


Извините, я новик в Java.

По опыту я знаю, что если я нарисовал один пиксел на экране, то он будет нарисованный, пока я сам его оттуда не сотру другим пикселом.

Кто стирает мой старый овал без спросу?
Как сказать ему, чтобы он не стирал мой старый овал?

Добавлено через 2 минуты и 9 секунд
Цитата(batigoal @ 11.1.2008,  14:46)
Prol, при reapint происходит полная перерисовка. Если тебе нужно, чтобы при этом рисовались ещё и старые изображения, тебе придется самому об этом позаботиться.

Что значит "полная перерисовка"?

Перерисовка чего? Всего окна или только овала?

Извините, я не могу уловить логику Java...
PM MAIL WWW ICQ   Вверх
Metal_Heart
Дата 11.1.2008, 14:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


а почему бы и нет?
**


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

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



Цитата(Prol @  11.1.2008,  14:46 Найти цитируемый пост)
Перерисовка чего? Всего окна или только овала?

перерисовка того компонента, на ком вызван repaint().

Сходи в раздел по книгам (ссылку не помню) и выбери себе достойную книгу.
Начинать лучше всего с внимательного чтения документации, а не валить вину на "каких-то" программистов.


--------------------
 не стыдно учиться, а стыдно не учиться 
PM ICQ   Вверх
Prol
Дата 11.1.2008, 14:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 11.1.2008
Где: Кыев, Украина

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



Цитата(Metal_Heart @ 11.1.2008,  14:53)
Цитата(Prol @  11.1.2008,  14:46 Найти цитируемый пост)
Перерисовка чего? Всего окна или только овала?

перерисовка того компонента, на ком вызван repaint().

Сходи в раздел по книгам (ссылку не помню) и выбери себе достойную книгу.
Начинать лучше всего с внимательного чтения документации, а не валить вину на "каких-то" программистов.

Я не нашёл исходного кода метода repaint()

 smile 
PM MAIL WWW ICQ   Вверх
batigoal
Дата 11.1.2008, 15:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


Профиль
Группа: Участник Клуба
Сообщений: 6423
Регистрация: 28.12.2004
Где: Санктъ-Петербургъ

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



Цитата(Prol @  11.1.2008,  15:56 Найти цитируемый пост)

Я не нашёл исходного кода метода repaint()

Метод repaint() стирает изображение компонента и вызывает paint(), который выводит новый овал. В твоем коде он не объявлен, и наследуется из класса Applet.


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
Prol
Дата 11.1.2008, 15:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 11.1.2008
Где: Кыев, Украина

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



Цитата(batigoal @ 11.1.2008,  15:03)
Цитата(Prol @  11.1.2008,  15:56 Найти цитируемый пост)

Я не нашёл исходного кода метода repaint()

Метод repaint() стирает изображение компонента и вызывает paint(), который выводит новый овал. В твоем коде он не объявлен, и наследуется из класса Applet.

Насколько я понимаю, метод repaint() в исходном тексте вызываетcя для объекта g.

Единственное место, где я вижу рисование овала - это метод g.paint()
Он рисует новый овал.

То есть по умолчанию метод g.repaint() затирает любое изображение перерисовкой фона, который фон указан для объекта g ?

Добавлено через 10 минут и 25 секунд
Метод paint() для объекта g мною переопределён, если вы прочитаете исходник.
В моём методе нету затирания старого овала.
Кто затирает старый овал?

Код

public void paint(Graphics g) {
     //draw the spot
     g.setColor(Color.red);
     if (spot != null) {
         g.fillOval(spot.x - RADIUS, spot.y - RADIUS, RADIUS * 2, RADIUS * 2);
        }
    }

PM MAIL WWW ICQ   Вверх
batigoal
Дата 11.1.2008, 16:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


Профиль
Группа: Участник Клуба
Сообщений: 6423
Регистрация: 28.12.2004
Где: Санктъ-Петербургъ

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



Prol, прочитай ещё раз моё сообщение.
Цитата(batigoal @  11.1.2008,  16:03 Найти цитируемый пост)
Метод repaint() стирает изображение компонента и вызывает paint()


Добавлено через 1 минуту и 37 секунд
Цитата(Prol @  11.1.2008,  16:14 Найти цитируемый пост)
метод repaint() в исходном тексте вызываетcя для объекта g.

Для апплета ClickMe, если быть точным. g - это просто графический контекст.


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
Prol
Дата 11.1.2008, 16:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 11.1.2008
Где: Кыев, Украина

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



Цитата(batigoal @ 11.1.2008,  16:11)
Цитата(Prol @  11.1.2008,  16:14 Найти цитируемый пост)
метод repaint() в исходном тексте вызываетcя для объекта g.

Для апплета ClickMe, если быть точным. g - это просто графический контекст.

g - это объект класса Graphics, как я понимаю из описания.
А repaint() - это метод объекта ClickMe класса Applet.
Я правильно понимаю?

Вопрос остаётся открытым, какой метод какого объекта меняет цвет на том месте, где был нарисован старый овал?

Поскольку метод ClickMe.paint() мною переопределён, то видимо у ClickMe, а точнее у класса Applet, от которого ClickMe унаследован,  есть какой-то невидимый метод, который затирает старый овал?





PM MAIL WWW ICQ   Вверх
batigoal
Дата 11.1.2008, 17:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


Профиль
Группа: Участник Клуба
Сообщений: 6423
Регистрация: 28.12.2004
Где: Санктъ-Петербургъ

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



Prol, повторяю в третий раз - это делает метод repaint().


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

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

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: GUI и Java FX приложения | Следующая тема »


 




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


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

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