java.awt - paint/repait kavar

Fórumok

Üdv!
Kezdő próbálkozásként egy nagyon egyszerű kis grafikus felületű programot bütykölök. JDK referencia és java könyv kéznél, de ezekből nem tudok kiigazodni paint/repaint/update ügyben. Szituáció: van egy scrolledpane, abban egy panel, abban canvas objektumok, amik egy-egy képet rajzolnak ki magukra egy paraméterben megadott méretre átskálázva. Indításkor minden rendben, a képet a canvas paint metódusa kirakja a megadott méretben, viszont amikor a program menüjéből átállítom ezt a bizonyos paramétert, hogy a képek mondjuk nagyobb méretben jelenjenek meg, akkor csak az első kép vált méretet, de az sincs rendesen kirajzolva. Ekkor a scrolledpane-t görgetve a képek átváltanak a helyes mérere. Az újrarajzoláshoz nyilván meg kellene valamit hívni a menüpont kezelőjéből, de minek és melyik metódusát? A canvas objektumokat befoglaló panelre update? Mondjuk, többek között már ezzel is próbálkoztam, de eredménytelenül.

Másik probléma: Adott területre egér belépés esetén (MouseEntered) megjelenítek egy window objektumot, amire majd szintén képet pakolnék. Ehhez kellene az ablak graphics objektuma. A window már kint van, de amikor elkérem a getGraphics metódusával a g-t, csak egy null-t kapok, és ezért nincs tovább, a háttészín beállításán túl nem tudok rá rajzolni. Mit lehet ilyenkor csinálni?

Hozzászólások

Hi!

Emlékszem, hogy régen én is bajlódtam az update-tel, de sajnos nem emlékszem a megoldásra.

A Graphics kontext ablakozós rendszerekben általában csak draw hívásokkor van jelen.
Ez kb úgy működik, hogy te megmondod az oprendszernek, hogy az ablakod tartalma érvénytelen, "ő" meg a rajzolási ciklusban meghívja a komponenesed rajzoló metódusait. Azaz elvileg nem nyúlhatsz a Graphics kontexthez amikor jólesik, csak a komponensed paint metódusában, amit nem te hívsz, hanem az oprendszer. Azért ebben nem vagyok 100%-ig biztos, hogy Javában is így van, de sok helyen így van és így is szokás kezelni a dolgot.

Új kép felvételét általában nem úgy érdemes megoldani, hogy a saját ojjektumod rajzolófüggvényében rajzolod fel, hanem amíg lehet érdemes komponenseket felvenni. A te esetedben valami imageket pakolni valami pane-re. Ha ojjektumot pakolsz akkor a frissítés is automatikusan megoldódik. Ha csak nem muszáj nem érdemes kikényszeríteni az újrarajzolást, meg általában belenyúlni ilyen mélységig a rendszer lelkivilágába. Vannak komponenseink, használjuk őket, hacsak lehet.

Amúgy én úgy tudom, hogy amióta van Swing az az ajánlott ablakozó rendszer, érdemes azzal próbálkozni. Majdnem ugyanolyan, mint az awt, csak elé kell írni egy J betűt minden osztálynévnek.

Ha vágod az angolt itt találtam egy összefoglalót, ami nekem elég jónak tűnik:

http://java.sun.com/products/jfc/tsc/articles/painting/

> A Graphics általában csak draw hívásokkor van jelen.
> te megmondod az oprendszernek, hogy az ablakod tartalma
> érvénytelen, "ő" meg a rajzolási ciklusban meghívja a
> komponenesed rajzoló metódusait ... amit nem te hívsz,
> hanem az oprendszer. Azért ebben nem vagyok 100%-ig
> biztos, hogy Javában is így van
Igen, így van, csak szoknom kell a dolgot. Még nem nagyom látom át, hogy mi megy automatikusan az ablakozó rendszer által végrehajtva, és mit kell nekem csinálni. Pl. hogy az általam említett windowt a saját paint()-jében tudom rajzolni. Ezért származtattam egy saját osztályt, és felülírtam a paint-et.

> Új kép felvételét általában nem úgy érdemes megoldani,
> hogy a saját ojjektumod rajzolófüggvényében rajzolod fel,
> hanem amíg lehet érdemes komponenseket felvenni.
> Ha ojjektumot pakolsz akkor a frissítés is automatikusan
> megoldódik.
Aha, kapizsgálom a dolgot. Tulajdonképpen a képet azért rajzolom magam (drawImage metódus), mert nem látom, hogy "komponensként" is fel lehetne helyezni. És mivel a képet később majd át kellhet méretezni, természetesnek tűnt, hogy magam teszem ki a paint-ben.

Át lehet méretezni a képet, de maga az eredeti Image nem komponens úgy, ahogy mondjuk egy checkbox. Ki lehet rajzolni a graphics.drawImage() metódussal. De ettől függetlenül is rá akarok jönni a dolog nyitjára, mert mi van, ha mondjuk egy vonagló szinuszhullámot akarnék kirajzolni a kép helyett, amit szintén kellene frissíteni. Most épp az a különös helyzet van, hogy az első átméretezéskor rendben átrajzolódik minden kép az új méretre, de többször már nem hajlandó ezt megtenni a program, ezután már csak az első rajzolódik újra, de az sem teljes egészében. Pedig próbáltam már a közvetlenül befoglaló és a fentebbi konténerek repait-jét is, de semmi. Ez tök alap dolog lehet egy ilyesmivel foglalkozó embernek, szóval nézegetem tovább...

Nem bonyolult, komponensben komponensben komponens, ahogy már csak egy grafikus felületeten van, és legbelül változtatnék meg valamit (ott lévő képeket kisebb/nagyobb méretben újrarajzolni). Még nem látom át, hogy melyik komponenst kell ehhez "noszogatni", vagy esetleg nekem kell-e valamilyen metódust felülírni. A repaint sem adott jó eredményt, de nyilván rosszul csinálok valamit. Linkeket köszönöm, ráfordulok majd, csak jelenleg egy kis pda-val tudok nethez férni, amit a levegőnek egy adott pontján kell tartanom, hogy menjen a wifi :) , most éppen így írok.

Hogy az a... Az egésznek természetesen semmi köze a paint/repaint metódusokhoz. Az arraylist, ami hitem szerint tartalmazta a képek konténereire a referenciát, kicsit üres volt, elfejetettem hozzáadni őket. (Tudom, hogy a tágabb konténerből is elérhetők lennének, de mégis ezt a másik listát használtam.) Ezúton is gratulálok magamnak, és természetesen én kérek elnézést. A képek már azonnal kirajzolódnak az új méretben. Na, azért még lesz mit csiszolni.