CRTANJE U PROZORU
Panel za crtanje
Swing komponente u Javi ne moraju biti samo u jednobojnom prikazu. Po njima je moguće iscrtavanje kako jednostavnih geometrijskih oblika (tačaka,linija,krug, elipsa,pravougaonik) tako i složenih geometriskih figura(polilinija, složenih otvorenih i zatvorenih krivih linija). Drukčije rečeno može se nacrtati crtež po bilo kojoj vrsti komponente(JPanel, JButton, itd).
Da bi se od jednobojne komponente dobila komponenta npr. panel sa crtežom, ta komponenta (panel u ovom primeru) mora pripadati klasi koja nasleđuje JComponent ili neku od klasa koja je prethodno nasledila klasu JComponent, npr klasu JPanel. Takođe u ovoj klasi se mora prepraviti nasleđena metoda paint (nalazi se u JComponent klasi).
Ova metoda se automatski poziva prilikom prvog iscrtavanja grafike, ili pri promeni veličine prozora, a može se pozivati i iz koda:
repaint();
Metoda paint kao parameter dobija objekat klase Graphics, unutar koga se nalaze metode potrebne za crtanje. Pozivom odgovarajuće metode crta se određen oblik. Npr. Da bi nacrtali elipsu koja je upisana u pravougaonik širine 400 i visine 300, a koji je od koo početka udaljen za 200 duž X ose i 100 duž Y ose, kod paint metode bi bio:
Ova metoda se automatski poziva prilikom prvog iscrtavanja grafike, ili pri promeni veličine prozora, a može se pozivati i iz koda:
repaint();
Metoda paint kao parameter dobija objekat klase Graphics, unutar koga se nalaze metode potrebne za crtanje. Pozivom odgovarajuće metode crta se određen oblik. Npr. Da bi nacrtali elipsu koja je upisana u pravougaonik širine 400 i visine 300, a koji je od koo početka udaljen za 200 duž X ose i 100 duž Y ose, kod paint metode bi bio:
@overriding
public void paint(Graphics g)
{
public void paint(Graphics g)
{
g.drawOval(200,100,400,300);
}Ovde g predstavlja alat za crtanje, tj. objekat koji sadrži metode za crtanje. Ova metoda paint je prepravljena(overriding) metoda jedne od nasleđenih klasa, u ovom slučaju to je klasa JComponent. Klasa JPanel nasleđuje JComponent, a ova prepavljena metoda paint mora biti u klasi koja nasleđuje JPanel klasu:
public class Crtez extends JPanel
{
{
@overriding
public void paint(Graphics g)
{
}public void paint(Graphics g)
{
// Neki kod
}Video lekcije
Crtanje u prozoru-Graphics
PRIMER: Geometrijske figure u Javi:
Tekst zadatka:
- Nacrtati kvadrat 400x400 na rastojanju 200 po X i 200 po Y osi..
- Nacrtati dijagonalu kvadrata
- U kvadrat upisati krug
Rešenje:
Objekat po kome će crtež biti iscrtan pripada klasi Crtez koja nasleđuje klasu JPanel . Ako kliknemo desnim tasterom miša u telo takve prazne klase i na kontekst meniju odaberemo Insert Code -> Override metod dobiće se nasleđene klase i u njima metode koje mogu da se preprave:
Metoda za crtanje paint nalazi se u klasi JComponent, pa je treba selektovati i klikom na dugme Generate neti u klasu:
Posle unosa ubačena je metoda:
Unutra je ubačen kod: super.paint(g);
koji poziva nasleđenu metodu paint. Ovo može da se iskoristi da se iscrta boja pozadine panela koji je nasleđen.
Crtež koji treba dobiti izgleda kao na slici ispod:
koji poziva nasleđenu metodu paint. Ovo može da se iskoristi da se iscrta boja pozadine panela koji je nasleđen.
Crtež koji treba dobiti izgleda kao na slici ispod:
Da bi se ovo nacrtalo kod u paint metodi izgleda:
Prvo se podešava boja za crtanje na plavu pomoću metode setColor objekta klase Graphics dobijenog kao parameter metode. Zatim se crta kvadrat pomoću metode drawRect(crta pravougaonik) koja traži 4 parametra. Prva dva predstavljaju X i Y koordinatu gornjeg levog ugla pravougaonika u odnosu na gornji levi ugao panela, gde se nalazi koo početak, dok treći i četvri parametar predstavljaju širinu i visinu pravougaonika. Pošto je pravougaonik sa jednakom širinom i visinom, reč je zapravo o kvadratu.
Metoda drawLine crta liniju između tačaka(100,500) i (500,100).
Metoda drawOval crta elipsu(krug) koja je upisana u pravougaonik(kvadrat) čiji su parametri identični sa parametrima drawRect metode.
Ove figure mogu da se iscrtaju in a drugi način tako što se određen geometrijski oblik kreira kao object određene klase iz API ja koja je implementirala interface Shape. Zatim se poziva metoda draw i njoj se prosleđuje kreirani oblik za iscrtavanje. Ova metoda ne postoji u klasi Graphics već u nasleđenoj klasi Graphics2D iz paketa java.awt.
Metoda drawLine crta liniju između tačaka(100,500) i (500,100).
Metoda drawOval crta elipsu(krug) koja je upisana u pravougaonik(kvadrat) čiji su parametri identični sa parametrima drawRect metode.
Ove figure mogu da se iscrtaju in a drugi način tako što se određen geometrijski oblik kreira kao object određene klase iz API ja koja je implementirala interface Shape. Zatim se poziva metoda draw i njoj se prosleđuje kreirani oblik za iscrtavanje. Ova metoda ne postoji u klasi Graphics već u nasleđenoj klasi Graphics2D iz paketa java.awt.
Klasa Graphics2D u Javi
Klase od kojih se mogu praviti razni objekti za crtanje, a koje implementiraju interface Shape se nalaze u paketu java.awt.geom.Mi koristimo klase Ellipse2D, Line2D i Rectangle2D da bi smo implementirali objekte krug, dijagonala i kvadrat. Unutar klase se prvo deklarišu ovi objekti kao atributi klase Crtez1, dok se objekti implementiraju u konstruktoru:
Sve tri klase imaju podvarijante Double i Float i očigledno je da je u ovom slučaju korišćena Double varijanta. Sva 4 parametra kruga i kvadrata su identična kao i kod metoda drawOval tj. drawRect objekta Graphics u prvoj varijanti zadatka.
Metoda paint sada izgleda:
Metoda paint sada izgleda:
Objekti g2 i g se razlikuju po tipu pa je potrebno izvršiti kastovanje. Ova klasa ima istu grafiku kao i klasa Crtez. Ako želimo npr da krug ispunimo bojom, onda bi smo umesto draw koristili fill metodu:
g2.fill(krug);
Posle pokretanja aplikacija bi izgledala:
g2.fill(krug);
Posle pokretanja aplikacija bi izgledala:
Panel klase Crtez ili Crtez1 povezujemo sa glavnim prozorom u glavnoj klasi:
Glavna klasa (GraphicsCrtanje)nasleđuje JFrame pa je zato objekat win, koji zapravo predstavlja glavni prozor aplikacije, klase GraphicsCrtanje.
Klasa | Metoda | Opis |
---|---|---|
java.awt.Graphics | drawRect(int x,int y, int w, int h) | Crta pravougaonik čiji je gornji levi ugao na kordinatama (x,y), w- širina h-visina |
java.awt.Graphics | drawLine(int x1,int y1, int x2, int y2) | Crta liniju od tačke (x1,y1), do tačke (x2,y2) |
java.awt.Graphics | drawOval(int x,int y, int w, int h) | Crta elipsu čiji je gornji levi ugao pravougaonika opisanog oko elipse na kordinatama (x,y), w- širina h-visina |
java.awt.Graphics | drawRoundRect(int x,int y, int w, int h,int arcW, int arcH) | Crta pravougaonik sa zaobljenim ivicama čiji je gornji levi ugao na kordinatama (x,y), w- širina h-visina arcW-horizontalni prečnik radijusa sva 4 ugla arcH-vertikalni prečnik radijusa sva 4 ugla |
java.awt.Graphics | drawArc(int x,int y, int w, int h, int pocU, int krajU) | Crta kružni luk čiji je gornji levi ugao na kordinatama (x,y), w- širina h-visina pocU-početni ugao luka krajU-krajnji ugao luka |
java.awt.Graphics | drawString(String str, int x,int y) | Crta String str unutar pravougaonika čiji je gornji levi ugao na kordinatama (x,y), |
java.awt.Graphics2D | draw(Shape shape) | Crta objekat koji čiji je gornji levi ugao pravougaonika opisanog oko elipse na kordinatama (x,y), w- širina h-visina |
java.awt.Graphics2D | fill(Shape shape) | Boji objekat koji čiji je gornji levi ugao pravougaonika opisanog oko elipse na kordinatama (x,y), w- širina h-visina |
java.awt.Graphics | fillRect(int x,int y, int w, int h) | Boji pravougaonik čiji je gornji levi ugao na kordinatama (x,y), w- širina h-visina |
java.awt.Graphics | fillOval(int x,int y, int w, int h) | Boji elipsu čiji je gornji levi ugao pravougaonika opisanog oko elipse na kordinatama (x,y), w- širina h-visina |
Sledeće
Kreiranje GUI-primer>| |