Java - Kresba Základní entity a jejich kresba ve třídě Graphics nemůžeme nastavit linii, šířku a typ, z grafických atributů jí můžeme nastavit pouze barvu Linie (čára)... drawline(int x1, int y1, int x2, int y2)... vykreslí linii, jdoucí z počátečního bodu P1[x1, y1] do koncového bodu P2[x2, y2]. Eliptická výseč.... drawarc(int x, int y, int sirka, int vyska, int start_uhel, int konc_uhel). Souřadnice x, y představují levý horní roh obdélníku zadané šířky a délky, do kterého je výseč vepsána, jsou dány počáteční a koncový úhel ovlivňující délku oblouku. Elipsa... drawoval(int x, int y, int sirka, int vyska) slouží k vykreslení elipsy vepsané do obdélníku zadané šířky a délky, jsou dány souřadnice levého horního rohu obdélníka. Polygon... polygon představuje uzavřenou oblast definovanou lomovými body spojenými úsečkami. Lze ho nakreslit metodou drawpolygon(), která je přetížená. Existují dvě varianty: drawpolygon(int [x], int [y], int pocet_vrcholu) a drawpolygon(polygon p). V první je polygon defnován polem x-ových a y-ových souřadnic, druhý objektem typu polygon. Polyline (lomená čára)... drawpolyline( int [x], int [y], int pocet_vrcholu). Význam parametrů je stejný jako u polygonu. Obdélník... drawrect(int x, int y, int sirka, int vyska). Význam parametrů je stejný jako u elipsy. 3D obdélník... draw3drect(int x, int y, int sirka, int vyska, boolean stav) vytvoří plastický obdélník připomínající tlačítko. Tlačítko může být zamáčklé nebo nezamáčklé, rozhoduje o tom booleovská proměnná stav. Text... drawstring(string text, int x, int y) - text umístěný na specifické souřadnice. Vyplňování entit barvou Útvary jsou standardně vyplňovány stejnou barvou, jakou byly nakresleny. Připomeňme metody setcolor( Color c) a getcolor() pro nastavení a získání barvy. Pokud chceme vyplnit útvar jinou barvou, než je nakreslen jeho obrys, nastavíme barvu pro výplň a vyplníme útvar, změníme barvu vykreslíme obrys útvaru. Parametry metod jsou stejné jako v případě metod pro kresbu nevyplněných entit. Vyplněný 3D obdélník... fill3drect(int x, int y, int sirka, int vyska, boolean stav). Vyplněná eliptická výseč... fillarc(int x, int y, int sirka, int vyska, int start_uhel, int konc_uhel) Vyplněná elipsa... filloval(int x, int y, int sirka, int vyska) Vyplněný polygon... fillpolygon(int [x], int [y], int pocet_vrcholu) nebo fillpolygon(polygon p). Grafický kontext poskytuje uživatelský souřadnicový systém a vše, co potřebujeme ke kreslení čehokoliv na komponentě grafický kontext = instance třídy Graphics (awt) nebo jeho potomka Graphics2D (swing) Graphics i Graphics2D jsou abstraktní třídy grafický kontext je vždy získán pro použití s konkrétní komponentou instance třídy Graphics2D se stará o mapování uživatelských souřadnic na souřadnice strojové, zahrnuje informaci o stroji, který je cílem výstupu odkaz na grafický kontext musíme mít předtím, než v něm začneme kreslit odkaz na grafický kontext můžeme vždy získat také pomocí metody getgraphics() 2/28/11 1/8 Java - kresba
Kreslení naše kreslící třída bude: potomkem třídy JComponent bude obsahovat metodu paint() nebo nověji paintcomponent(), pomocí těchto metod kreslíme grafický kontext je předán metodě paintcomponent() grafickému kontextu Graphics můžeme nastavit vlastnosti: barva... g.setcolor(color barva) typ písma... g.setfont(new Font("SansSerif",Font.ITALIC+Font.BOLD,20)); příklad 1a - Graphics: public class KresbaObrazce extends JComponent { public void paintcomponent(graphics g) { g.setcolor(color.blue); g.fillrect(40,50,300,200); g.setcolor(color.yellow); g.setfont(new Font("SansSerif",Font.ITALIC+Font.BOLD,20)); g.drawstring("ahoj",160,160); grafickému kontextu Graphics2D můžeme nastavit vlastnosti: paint = kresba = barva... g2d.setpaint() stroke = tah = styl čáry font = písmo transform = transformace clip = oříznutí composite = kompozice = jak budou kresleny překrývající se tvary můžeme použít metody pro kreslení: draw(shape tvar) fill(shape tvar) drawstring(string text) drawimage() metody pro překreslování paint() nebo nověji paintcomponent()... volána vždy, když má být komponenta rekonstruována, způsobí překreslení celé komponenty repaint()... způsobí překreslení celé komponenty voláním metody paint() je přetížená jako parametr můžeme použít časový limit a oblast, která má být překreslena příklad 1b - Graphics2D: public class KresbaObrazce extends JComponent { public void paintcomponent(graphics g) { super.paintcomponent(g); Graphics2D g2d = (Graphics2D)g; // musíme přetypovat g2d.setpaint(color.red); g2d.draw(new Rectangle(100,100,200,200)); g2d.setpaint(color.green); int[] x = {10, 240, 150; int[] y = {30, 100, 310; g2d.draw(new Polygon(x,y,3)); 2/28/11 2/8 Java - kresba
Instanci třídy Kresba obrazce pak použijeme v hlavním okně GUI: public class Platno extends JFrame { private Container obsah; private JPanel po; private KresbaObrazce ko; public Platno() { inicializace(); obsah(); zviditelneni(); public void inicializace() { this.setsize(400,400); this.settitle("kreslící plátno"); obsah = this.getcontentpane(); obsah.setlayout(new BorderLayout()); public void obsah() { po = new JPanel(); po.setbackground(color.white); po.setlayout(new BorderLayout()); obsah.add(po, BorderLayout.CENTER); ko = new KresbaObrazce(); po.add(ko); public void zviditelneni () { this.setdefaultcloseoperation(dispose_on_close); this.setvisible(true); 2/28/11 3/8 Java - kresba
Příklad 2: Přidáme si panel s možností volby obrazce a budeme reagovat na stisk odpovídajícího tlačítka: public class Platno extends JFrame { private int sirka, vyska; private Container obsah; private JButton[] co = new JButton[3]; private JPanel pb, po; private KresbaObrazce ko; public Platno(int sirka, int vyska) { this.sirka = sirka; this.vyska = vyska; inicializace(); obsah(); zviditelneni(); public void inicializace() { this.setsize(sirka,vyska); this.settitle("plátno"); obsah = this.getcontentpane(); obsah.setlayout(new BorderLayout()); public void obsah() { pb = new JPanel(); this.getcontentpane().add(pb, BorderLayout.NORTH); co[0] = new JButton("nakresli kruh"); co[1] = new JButton("nakresli obdélník"); co[2] = new JButton("napis text"); for (int i=0; i<3; i++) { pb.add(co[i]); co[i].addactionlistener(new Kresba(i)); po = new JPanel(); po.setbackground(color.white); po.setlayout(new BorderLayout()); this.getcontentpane().add(po, BorderLayout.CENTER); ko = new KresbaObrazce(-1); po.add(ko); /* handler = zobrazí odpovídající obrazec */ class Kresba implements ActionListener { int druh; public Kresba(int druh) { this.druh = druh; public void actionperformed(actionevent e) { kresli(e, druh); public void kresli(actionevent e, int druh) { ko.setobrazec(druh); po.repaint(); public void zviditelneni () { this.setdefaultcloseoperation(dispose_on_close); this.setvisible(true); 2/28/11 4/8 Java - kresba
public class KresbaObrazce extends JComponent { private int druh; public KresbaObrazce(int druh) { this.druh=druh; public void setobrazec(int druh) { this.druh=druh; public void paintcomponent(graphics g) { switch (druh) { case -1: System.out.println("začátek"); break; case 0: g.setcolor(color.red); g.drawoval(40,40,100,100); break; case 1: g.setcolor(color.blue); g.drawrect(100,200,120,60); break; case 2: g.setcolor(color.green); g.setfont(new Font("SansSerif",Font.ITALIC+Font.BOLD,20)); g.drawstring("ahoj",160,160); break; 2/28/11 5/8 Java - kresba
Příklad 3: Vybudujeme vlastní garfické komponenty: public class Bod { private int x,y; public Bod(int x, int y) { this.x=x; this.y=y; int getx() { return x; int gety() { return y; ---------------------------------------------------------------------------------- public class Kruh { private int polomer; private Bod stred; public Kruh(Bod stred, int polomer) { this.stred = stred; this.polomer=polomer; public Bod getstred() { return this.stred; public int getpolomer() { return this.polomer; ---------------------------------------------------------------------------------- import java.util.*; public class GenerujKruh { int sirka, vyska; int x, y, polomer; private Kruh k; Random rnd; public GenerujKruh(int sirka, int vyska) { this.sirka = sirka; this.vyska = vyska; rnd = new Random(); polomer = rnd.nextint(sirka/6)+3; x = rnd.nextint(sirka-2*polomer) + polomer; y = rnd.nextint(vyska-2*polomer) + polomer; k = new Kruh(new Bod(x, y), polomer); Kruh getkruh() { return k; ---------------------------------------------------------------------------------- import java.awt.*; import javax.swing.jcomponent; 2/28/11 6/8 Java - kresba
public class KresbaKruhu extends JComponent { private GenerujKruh kr; private int sirka, vyska; private Kruh k; boolean kreslit; public KresbaKruhu() { kreslit = false; public void setkruh() { sirka = this.getwidth(); vyska = this.getheight(); kr = new GenerujKruh(sirka, vyska); k = kr.getkruh(); kreslit = true; repaint(); public void paintcomponent(graphics g) { if (kreslit) { g.setcolor(color.red); int x = k.getstred().getx() - k.getpolomer(); int y = k.getstred().gety() - k.getpolomer(); g.drawoval(x, y, 2*k.getPolomer(), 2*k.getPolomer()); ----------------------------------------------------------------------------------- public class Platno extends JFrame { private int sirka, vyska; private JButton tlac; private JPanel pb, po; private KresbaKruhu kk; public Platno(int sirka, int vyska) { this.sirka = sirka; this.vyska = vyska; inicializace(); obsah(); public void inicializace() { this.setsize(sirka,vyska); this.settitle("kružnice"); this.setdefaultcloseoperation(dispose_on_close); this.setlayout(new BorderLayout()); public void obsah() { pb = new JPanel(); this.getcontentpane().add(pb, BorderLayout.NORTH); tlac = new JButton("generuj kruh"); pb.add(tlac); tlac.addactionlistener(new Kresba()); po = new JPanel(); po.setbackground(color.white); po.setlayout(new BorderLayout()); this.getcontentpane().add(po, BorderLayout.CENTER); kk = new KresbaKruhu(); po.add(kk); 2/28/11 7/8 Java - kresba
/* handler = zobrazí odpovídající obrazec */ class Kresba implements ActionListener { public void actionperformed(actionevent e) { kresli(e); public void kresli(actionevent e) { kk.setkruh(); public static void main (String[] args) { Platno p = new Platno(500,700); p.setvisible(true); 2/28/11 8/8 Java - kresba