| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Java: GUI и Java FX приложения > Кто и где закрашивает старый овал |
| Автор: Prol 11.1.2008, 13:49 | ||
| Этот апплет рисует красный овал там, где нажимается мышка. Но мне непонятно, кто и где закрашивает старый овал в цвет фона? Я не люблю, когда программы делают то, чего я их не прошу. В тексте апплета есть как рисуется новый овал, но нету как затирается старый овал :о)
|
| Автор: Platon 11.1.2008, 14:09 | ||
а это по твоему что?! |
| Автор: Prol 11.1.2008, 14:15 | ||||
Если это закомментировать, то всё равно старый овал кто-то затирает :о) |
| Автор: Metal_Heart 11.1.2008, 14:28 | ||
| Prol, Вот ответ на твой вопрос:
Ты же не хранишь ранее нарисованные фигуры? Нет? А кто это должен делать? Вот они и не стали этого реализовывать |
| Автор: Prol 11.1.2008, 14:33 | ||||
Нипанятнаааа... Как сделать так, чтобы "кто-то" не затирал старый овал, если его об этом не прошу? |
| Автор: batigoal 11.1.2008, 14:46 |
| Prol, при reapint происходит полная перерисовка. Если тебе нужно, чтобы при этом рисовались ещё и старые изображения, тебе придется самому об этом позаботиться. |
| Автор: Prol 11.1.2008, 14:46 | ||||
Извините, я новик в Java. По опыту я знаю, что если я нарисовал один пиксел на экране, то он будет нарисованный, пока я сам его оттуда не сотру другим пикселом. Кто стирает мой старый овал без спросу? Как сказать ему, чтобы он не стирал мой старый овал? Добавлено через 2 минуты и 9 секунд
Что значит "полная перерисовка"? Перерисовка чего? Всего окна или только овала? Извините, я не могу уловить логику Java... |
| Автор: Metal_Heart 11.1.2008, 14:53 |
перерисовка того компонента, на ком вызван repaint(). Сходи в раздел по книгам (ссылку не помню) и выбери себе достойную книгу. Начинать лучше всего с внимательного чтения документации, а не валить вину на "каких-то" программистов. |
| Автор: Prol 11.1.2008, 14:56 | ||
Я не нашёл исходного кода метода repaint() |
| Автор: batigoal 11.1.2008, 15:03 |
Метод repaint() стирает изображение компонента и вызывает paint(), который выводит новый овал. В твоем коде он не объявлен, и наследуется из класса Applet. |
| Автор: Prol 11.1.2008, 15:14 | ||||
Насколько я понимаю, метод repaint() в исходном тексте вызываетcя для объекта g. Единственное место, где я вижу рисование овала - это метод g.paint() Он рисует новый овал. То есть по умолчанию метод g.repaint() затирает любое изображение перерисовкой фона, который фон указан для объекта g ? Добавлено через 10 минут и 25 секунд Метод paint() для объекта g мною переопределён, если вы прочитаете исходник. В моём методе нету затирания старого овала. Кто затирает старый овал?
|
| Автор: batigoal 11.1.2008, 16:11 | ||
Prol, прочитай ещё раз моё сообщение.
Добавлено через 1 минуту и 37 секунд Для апплета ClickMe, если быть точным. g - это просто графический контекст. |
| Автор: Prol 11.1.2008, 16:37 | ||
g - это объект класса Graphics, как я понимаю из описания. А repaint() - это метод объекта ClickMe класса Applet. Я правильно понимаю? Вопрос остаётся открытым, какой метод какого объекта меняет цвет на том месте, где был нарисован старый овал? Поскольку метод ClickMe.paint() мною переопределён, то видимо у ClickMe, а точнее у класса Applet, от которого ClickMe унаследован, есть какой-то невидимый метод, который затирает старый овал? |
| Автор: batigoal 11.1.2008, 17:21 |
| Prol, повторяю в третий раз - это делает метод repaint(). |
| Автор: dorogoyIV 11.1.2008, 18:18 | ||
вот посмотри: - здесь можно таскать инажимать
|
| Автор: Prol 11.1.2008, 21:20 | ||
Повторю в третий раз, как сказать етому репайнту, чтобы он не делал того, что я его не прошу? Сейчас какой-то репейнт затирает без моего спросу безобидный овал, завтра какой-нибудь другой метод без моего спросу уничтожит данные пользователя и меня уволят с работы. Я не привык, чтобы мои программы делали то, чего я в них явно не прописал. |
| Автор: w1nd 11.1.2008, 23:49 | ||||||
Никоим образом.
Такое возможно только в однооконных системах. В многооконной системе каждое окно и каждый компонент должны уметь полностью нарисовать себя в любой момент, потому что экран не принадлежит ни одному из них. Если вы нарисовали овал #1 и хотите, чтобы он остался на месте, вы должны перерисовывать его всякий раз, когда вызывается paint().
Вы ничего не написали в вашей программе для того, чтобы однажды нарисованные фигуры сохранялись. |
| Автор: batigoal 12.1.2008, 00:08 | ||
Раньше у тебя этот вопрос не звучал, было только - "кто?" Думаю, ты можешь его переопределить у себя в классе, но это - неправильный подход. Правильный - это запомнить тем или иным образом предыдущие положения овалов и отрисовывать их все в paint(). |
| Автор: Prol 12.1.2008, 01:30 |
| Я понял, в чём проблема. :о))) Я привык, что монитор (окно) - это память. Например: - рисуем пиксел в координатах 100,100 - рисуем пиксел в координатах 200,200 Пока мы ничего не рисуем в координатах 100,100, то там останется пиксел, который мы нарисовали раньше. Поэтому меня напугало исчезновение овала со старого места. А вот что я понял: Что при любом событии перерисовывается полностью всё окно, начиная от фона и заканчивая каждым объектом. Я привык перемещение объекта программировать так: сначала его стереть на старом месте, потом нарисовать на новом. А тут в Java получается, что я его на новом месте нарисовал своим методом paint, а кто-то его на старом месте стёр. А я не люблю, чтобы моя прога делала что-то без моего на то прямого указания. Скачал исходники, нашёл repaint в java.awt.Component и понял, что при любом событии вызывается пайнт контейнера, который полностью его перерисовывает, начиная с фона. Фон перерисовывается. старый овал стирается, потом рисуется новый овал. :о))) Зверство. Я не привык чтобы реакцией на любое событие была перерисовка всего окна со всеми объектами изображёнными в окне... а потом удивляются, куда делась мощность современных компов... да просто программисты не мудрствуя лукаво при любом событии заново перерисовывают всё окно... нда... |
| Автор: w1nd 12.1.2008, 01:52 | ||
Prol, это не свойство java или ещё какого-либо runtime. Это свойство любой графической оконной системы. Отродясь. Уже лет двадцать как. И именно для того, чтобы ресурсов компьютера (в данном случае - памяти) хоть на что-то хватало. Вылезайте уже из каменного века - текстовых оконных систем
Эта память разделяется между всеми компонентами, которые могут перекрываться. Вы что же думаете, что в видеопамять можно запихать эдак сотню-другую видеостраниц?! |
| Автор: Prol 12.1.2008, 02:11 |
| Да я понял :о) Раньше компьютеры были большие и памяти имели мало, поэтому приходилось в сто килобайт писать всё приложение причём с картинками, которое в реалтайме обслуживало сотню юзеров :о) А сейчас компьютеры маленькие, память имеют - экономить не нужно, так что можно и окна перерисовывать полностью, плевать на ресурсы, потому что обслуживает одного юзера :о))) В видеопамять можно запихнуть хоть тысячу видеостраниц :о) Прерывание на загрузку отсутствуещей в памяти страницы ещё никто не отменял. |
| Автор: w1nd 12.1.2008, 02:23 | ||||
Вы бы хоть прочитали, что я написал (если сами не понимаете) и немножко подумали прежде.
Вас обманули. Такой возможности нет и никогда не было. Прерывание есть, но не в видеопамяти честь. |
| Автор: nornad 12.1.2008, 03:47 |
Если я ничего не путаю, то в винде, например, сейчас доступна либо одна страница памяти, либо есть возможность получить доступ ко второй странице и использовать её в качестве видеобуфера. Нарисовал в буфер - перключился на него, нарисовал в предыдущем - перключился. Но это - нативная штука и в Java вроде бы явным образом не присутствует (хотя гарантировать не буду, ибо на этом уровне не лазал). Про линукс и другие платформы тоже ничего не скажу, ибо не знаю. P.S. Писать на Java используя парадигмы DOS'а - это круто. |
| Автор: Prol 12.1.2008, 04:06 | ||
На Java работают микроволновки и стиральные машинки, и прекрасно обрабатывают прерывания от электромоторов и кнопок на панелях управления этими дивайсами :о) P.S. Рекомендую почитать, что было до "парадигмы ДОСа" :о) Вы удивитесь, насколько опошлились программисты, развращённые безответственностью за свои программы. Более того, программисты воинственно обнаглели, объявив всему миру в своих так называемых "лицензиях", что не несут ответственности за последствия действия своих программ. |
| Автор: nornad 12.1.2008, 06:00 | ||
Только вот там малость не та JVM и многозадачности не наблюдается. Ты же хочешь рисовать в многозадачной среде, а посему - забудь о микроволновках и интеллектуальных открывашках пивных банок. Чтобы писать сносно на каком-либо языке надо в общих чертах с ним разобраться и знать основные фразы. Чтобы писать правильно - надо понять язык и принять его. Заметь, "сносно" никогда не бывает лучшего качества, чем "правильно". Будем пиписькамивозрастом меряться? Я в курсе, что было "до". Я знаю, как "надо". Но в современных условиях частью критериев можно немного пренебречь. Отсюда и GC, кстати. Потому что памяти сейчас много. А когда совсем не хватает - вот тогда наступают тяжёлые времена для развращённой прыщавой восторженной молодёжи Но при всём при этом эти прыщавые юнцы, приняв современную идеологию, будут писать быстрее тебя с незыблемыми принципами. И могут оттяпать немалый кусок хлеба, если не подсуетиться вовремя. P.S. Если кому интересно, мой возраст есть в профиле. Точнее, дата рождения. Не старик, конечно, но и не прыщав уже, как мне кажется. |
| Автор: Prol 12.1.2008, 07:32 | ||
Ну и пусть тяпают :о) Всех денег не заработаешь :о) Тем более, скоро пенсия :о) Пусть молодые суетятся, пока ихние девки моложе :о) |
| Автор: nornad 12.1.2008, 08:17 |
Ладно, уел, крыть нечем. |
| Автор: Prol 12.1.2008, 08:20 | ||
|