Přednáška 3 Princip zobrazování obsahu Základní grafika Překreslení (vykreslení) obsahu komponenty se realizuje při příchodu zprávy paint Standardně se o zobrazení stará samostatné vlákno Principiálně nelze určit přesný okamžik vykreslení Rodičovská komponenta zabezpečí překreslení dceřiných komponent (tj. těch, které jsou vloženy do jejího kontejneru) Každá komponenta je zodpovědná za svůj obsah Důležité je pořadí komponent (z-order) OK Cancel OK OK Cancel Cancel 1 Přednáška 3 2 Zobrazovací metody Grafický kontext Kód pro zobrazení (co se má vykreslit) je v metodě paint (Graphics g) // pro AWT paintcomponent (Graphics g) // pro Swing Tyto zděděné prázdné metody je třeba přepsat (+ volání metody předka) Pro zobrazení komponenty se volá clearrect( ); // vymazání plochy (části) barvou pozadi paint( ); // nebo paintcomponent( ) pro vykr. obsahu Pro programové překreslení se volá metoda repaint(), která volá update (Graphics g) { g.clearrect( ); // zabezpečí vymazání paint (g); // respektive paintcomponent(g); } přepsáním metody update() lze zabezpečit NEPŘEMAZÁVÁNÍ původního obsahu package java.awt; class Graphics V JAVĚ je grafický kontext STAVOVÝ (pamatuje si stav, např. nastavenou barvu) Umožňuje přístup ke kreslící ploše Identifikuje plochu, kam se posílá grafický vstup Je zabalen do instance třídy Graphics Instanci Graphics lze získat pro každou třídu, která je potomkem Components jako parametr v kreslících metodách pomocí metody getgraphics(), která vytvoří nový grafický kontext pro danou komponentu Třída Graphics2D a související třídy budou probrány později. Přednáška 3 3 Přednáška 3 4
Atributy Graphics Komponenta, se kterou je kontext asociován Souřadnice počátku souřadnicového systému K počátku se vztahuje kreslení ořezávání Ořezávací oblast (Clip) Aktuální barva Aktuální font Režim kreslení (XOR režim, normální kreslící režim) Ořezávání výstupu Grafický výstup je realizován pouze do oblasti, která je k tomu určena clip Nastavení ořezávací oblasti void cliprect (int x, int y, int width, int height) průnik současné ořezávací oblasti a nového pravoúhelníku void setclip (Shape clip) parametr null maže ořezávací oblast void setclip(int x, int y, int width, int height) Zjištění ořezávací oblasti Shape getclip() Rectangle getclipbounds() Přednáška 3 5 Přednáška 3 6 Vymazání plochy, kopírování Double Buffering void clearrect(int x, int y, int width, int height) vymaže plochu barvou pozadí, která je nastavena pro danou komponentu ekvivalent: setcolor + fillrect Kopie pravoúhlé oblasti na zadanou pozici void copyarea(int x, int y, int width, int height, int dx, int dy) Technika, zamezující blikání obrazu Blikání vzniká v důsledku postupného překreslování obrazu hotový snímek vymazání obsahu postupné vykreslení jednoho objektu vykreslení dalšího objektu = hotový snímek Přednáška 3 7 Přednáška 3 8
Princip Double Bufferingu Grafický souřadnicový systém Vymazání Stejný jako SS komponent Kreslení [0, 0] Kreslení height Back buffer [width-1, height-1] Zobrazení (rychlé zkopírování) na primární plochu width Přednáška 3 9 Přednáška 3 10 Barva 255, 255, 255 Základní barvy Založena na modelu RGB (ARGB) Implicitně se pracuje s barevným prostorem srgb Barevné složky: R (Red), G (Green), B (Blue), A (Alpha value) 255, 255, 255 128, 0, 0 255, 0, 0 0, 255, 255 0, 128, 128 Povolený rozsah 192, 192, 192 0.0F..1.0F 0..255 Význam hodnot Při nedodržení rozsahu dojde k výjimce! 128, 128, 128 0, 128, 0 0, 255, 0 255, 0, 255 128, 0, 128 0 (0.0F) pro barvu: nulový jas; α-kanál: úplná průhlednost 255 (1.0F) pro barvu: maximální jas; α-kanál: 100 % krytí (A, R, G, B) (255, 204, 51, 0) (192, 204, 51, 0) (128, 204, 51, 0) (64, 204, 51, 0) (0, 204, 51, 0) 64, 64, 64 0, 0, 128 0, 0, 255 255, 255, 0 128, 128, 0 0, 0, 0 Přednáška 3 11 Přednáška 3 12
Třída Color Systémové barvy package java.awt Obsahuje 13 statických prvků pro základní barvy : BLACK, BLUE, CYAN, DARK_GRAY, GRAY, GREEN, LIGHT_GRAY, MAGENTA, ORANGE, PINK, RED, WHITE, YELLOW Konstruktory Color (int rgb) // R: bity 23..16; G: bity 15..8; B: bity 7..0 // (RRRRRRRRGGGGGGGGBBBBBBBB) Color (int r, int g, int b) Color (int r, int g, int b, int a) Color (float r, float g, float b) Color (float r, float g, float b, float a) Color (int rgba, boolean hasalpha) pokud (hasalpha==true) bity 31..24 jsou použity pro alfa kanál jinak jsou ignorovány a je vytvořena barva s krytím 100 % Přednáška 3 13 package java.awt; Konstantní třída SystemColor Obsahuje statické prvky: activecaption, activecaptiontext, control, controltext, desktop, inactivecaption, Prvky odpovídají barvám nastaveným v systému Color c = SystemColor.desktop; // barva pracovní plochy Přednáška 3 14 Barevné složky Barevné složky modelu RGB lze získat pomocí metod třídy Color int getred() int getgreen() int getblue() int getalpha() Příklad: vytvoření světlejší barvy (ne úplně korektní) Color c = SystemColor.control; int r = c.getred() r = ((r+10)>255)? 255 : r+10; int g = c.getgreen() g = ((g+10)>255)? 255 : g+10; int b = c.getred() b = ((b+10)>255)? 255 : b+10; Color novabarva = new Color(r, g, b); Systémová barva pozadí komponenty! Nutno kontrolovat rozsah 0..255! Takto vzniklá barva je světlejší, ale má posunutý barevný odstín! Nastavení barvy kreslení Grafický kontext obsahuje pouze jednu barvu, kterou se kreslí obrysy (při použití metod drawxxx) výplně (při použití metod fillxxx) setcolor (Color c) Color getcolor ) setcolor(new Color(16777215)); // nastavení bílé barvy 256^3 setcolor(new Color(255, 0, 0)); // červená setcolor(color.red); // červená setcolor(systemcolor.activecaption); // systémová barva // aktivního titulkového pruhu Přednáška 3 15 Přednáška 3 16
Další metody třídy Color Světlejší a tmavší odstín (vratná operace, ale díky zaokrouhlení ne na přesně stejnou hodnotu). Vždy 100 % krytí. Color darker() Color brighter () Konverze mezi HSL a RGB modelem (statické metody) int HSBtoRGB(float hue, float satur, float brightness) float[] RGBtoHSB(int r, int g, int b, float[] hsbvals) Color gethsbcolor(float h, float s, float b) Barevné složky float[] getrgbcolorcomponents(float[] comparray) float[] getrgbcomponents(float[] comparray) + 2 metody pracující dle nastaveného barevného modelu Kreslení grafických primitiv drawxxx ( ) fillxxx ( ) drawstring ( ) drawimage ( ) Převod na číselné vyjádření (včetně alfa kanálu) int getrgb() TEXT Přednáška 3 17 Přednáška 3 18 Úsečka, lomená čára void drawline(int x1, int y1, int x2, int y2) souřadnice počátečního bodu: [x1, y1] souřadnice koncového bodu: [x2, y2] kreslí čáru včetně počátečního a koncového bodu void drawpolyline(int[] xpoints, int[] ypoints, int npoints) lomená čára pokud je poslední a první bod totožný, je uzavřena Příklad kreslení úsečky a lomené čáry g.drawline(3, 2, 10, 5); g.setcolor(color.red); g.drawline(2, 5, 2, 8); g.drawline(10, 2, 10, 2); int x[] = {2,12,11,1}; int y[] = {2,7,0,9}; g.drawpolyline(x, y, 4); Přednáška 3 19 Přednáška 3 20
Pravoúhelník void drawrect(int x, int y, int width, int height) levý horní roh: [x, y] pravý dolní roh: [x+width, y+height] void fillrect(int x, int y, int width, int height) levý horní roh: [x, y] pravý dolní roh: [x+width-1, y+height-1] Pravoúhelník s oblými rohy void drawroundrect(int x, int y, int width, int height, int arcwidth, int archeight) pravoúhelník se zakulacenými rohy arcwidth horizontální poloměr rohových oblouků archeight vertikální poloměr rohových oblouků void fillroundrect(int x, int y, int width, int height, int arcwidth, int archeight) pravoúhelník se zakulacenými rohy arcwidth horizontální poloměr rohových oblouků archeight vertikální poloměr rohových oblouků rozměry totožné s fillrect Přednáška 3 21 Přednáška 3 22 Příklad kreslení pravoúhelníku Kružnice, elipsa, kruh g.drawrect(2, 2, 10, 5); g.drawline(12, 7, 12, 7); g.setcolor(color.red); g.fillrect(2, 2, 10, 5); fill + draw draw + fill void drawoval(int x, int y, int width, int height) elipsa (kružnice) vepsaná do pravoúhelníku levý horní roh: [x, y] pravý dolní roh: [x+width, y+height] void filloval(int x, int y, int width, int height) elipsa (kružnice) vepsaná do pravoúhelníku g.drawline(12, 7, 12, 7); Přednáška 3 23 Přednáška 3 24
Příklad kreslení elipsy a eliptické výplně Kruhový a eliptický oblouk, výseč g.drawline(12, 7, 12, 7); g.drawoval(2, 2, 10, 5); fill + draw void drawarc(int x, int y, int width, int height, int startangle, int arcangle) střed oblouku leží ve středu pravoúhelníku s levým horním rohem v [x, y] s pravým dolním rohem [x+width, y+height] Oblouk se kreslí od startangle () arcangle: + (proti směru h.r.), - (po směru h.r.) g.drawline(12, 7, 12, 7); g.setcolor(color.red); g.filloval(2, 2, 10, 5); draw + fill void fillarc(int x, int y, int width, int height, int startangle, int arcangle) Přednáška 3 25 Přednáška 3 26 Příklad kreslení oblouku a výseče N-úhelník g.drawline(14, 10, 14, 10); g.setcolor(color.white); g.drawoval(2, 2, 12, 8); g.drawarc(2, 2, 12, 8, 0, 230); g.drawline(14, 10, 14, 10); g.setcolor(color.yellow); g.filloval(2, 2, 12, 8); g.setcolor(color.red); g.fillarc(2, 2, 12, 8, 0, 230); fill + draw draw + fill void drawpolygon(int[] xpoints, int[] ypoints, int npoints) automatické uzavření v případě, že první a poslední bod jsou různé drawpolygon(polygon p) void fillpolygon(int[] xpoints, int[] ypoints, int npoints) fillpolygon(polygon p) Vyplňování nekonvexních polygonů probíhá v režimu Alternate, tj. střídání vyplněných a nevyplněných ploch (jiný režim, zde nepodporovaný je Winding ) Přednáška 3 27 Přednáška 3 28
Příklad kreslení n-úhelníku int x[] = {2,12,11,1}; int y[] = {2,7,0,9}; g.fillpolygon(x, y, 4); Zobrazení textu void drawstring(string str, int x, int y) zobrazí zadaný řetězec tak, že BASELNE levého znaku leží na y-ové souřadnici vztažného bodu [x, y] používá font a barvu nastavenou v grafickém kontextu int x[] = {2,12,11,1}; int y[] = {2,7,0,9}; g.setcolor(color.red); g.fillpolygon(x, y, 4); fill + draw draw + fill Nastavení fontu void setfont(font font) Font getfont() Text [x,y] Přednáška 3 29 Přednáška 3 30 Font rychlý přehled Konstruktor Font (String name, int style, int size); Name (MS Win): CourierNew (Nonospaced), Arial (SansSerif), TimesNewRoman (Serif), Arial (Dialog), CourierNew (DialogInput) style: Font.BOLD, Font.PLAIN, Font.ITALIC size: velikost v typografických bodech (1/72 ) Font = new Font ( Arial, Font.ITALIC + Font.Bold, 12); Rodina písma (FontFamily) Dostupné fonty GraphicsEniroment ge = GraphicsEnviroment.getLocalGraphicsEnviroment; Font[] fontfamily = ge.getallfnts(); Metrika fontu FontMetrics Měření fontu Graphics.getFontMetrics() metrika aktuálního fontu Graphics.getFontMetrics(Font f) metrika libovolného fontu FontMetrics fm = g.getfontmetrics(); int width = fm.stringwidth( Dobrý den! ); getleading() getascent() getdescent() getheight() getmaxascent() getmaxascent() charwidth (char c) stringwidth(string s) HODNOTY jsou v pixelech getascent() getdescent() getleading() Akcentová dotažnice (Ascende Line) Horní dotažnice getheight() Účaří (Base Line) Dolní dotažnice (Descender Line) Přednáška 3 31 Přednáška 3 32
Zobrazení rastrového obrázku přehled XOR režim drawimage(image img, int x, int y, ImageObserver observer) drawimage(image img, int x, int y, Color bgcolor, ImageObserver observer) drawimage(image img, int x, int y, int width, int height, ImageObserver observer) drawimage(image img, int x, int y, int width, int height, Color bgcolor, ImageObserver observer) drawimage(image img, int dx1, int dy1, int dx2, int dy2, int sx1, int sy1, int sx2, int sy2, ImageObserver observer) drawimage(image img, int dx1, int dy1, int dx2, int dy2, int sx1, int sy1, int sx2, int sy2, Color bgcolor, ImageObserver observer) Návratová hodnota: boolean, nastavena na true, pokud je obrázek kompletně načten a nebude se měnit bgcolor: podkladová barva, využitá při průhlednosti observer: objekt, sledující stav zpracování obrázku XOR negace ekvivalence Metody Graphics SetPaintMode SetXORMode Přednáška 3 33 Přednáška 3 34 Výběr barvy pomocí dialogu Výběr fontu pomocí dialogu Color puvodnibarva = getbackground(); Color novabarva = JColorChooser.showDialog (null, "Výběr barvy", puvodnibarva) if (novabarva!=null) { setbackground(novabarva); } JFontChooser fontchooser = new JFontChooser(); int result = fontchooser.showdialog(parent); if (result == JFontChooser.OK_OPTION) { Font font = fontchooser.getselectedfont();... } Přednáška 3 35 Přednáška 3 36
Události myši Práce s tlačítky myši Listener: MouseEvent (addmouselistener) Handler: MouseListener (parametr MouseEvent) mouseclicked() mouseentered() mouseexited() mousepressed() mousereleased() Pohyb myši Listener: MouseMotionEvent (addmousemotionlistener) Handler: MouseMotionListener (parametr MouseEvent) mousemotiondragged() mousemotionmoved() Přednáška 3 37