You are on page 1of 17

Seminarska rabota po predmetot

Internet programirawe

Naslov na temata

Grafika vo JAVA

Institut za kompjuterska tehnika i informatika


Fakultet za elektrotehnika i informaciski tehnologii,Skopje
Sodr`ina

1.Voved..............................................................................................2
2.Klasa za grafika..........................................................................3
2.1.drawString() metod.....................................................................8
2.2.drawLine() metod........................................................................8
2.3.drawRect() metod........................................................................9
2.4.drawImage() metod...................................................................10
3.Color class....................................................................................12
4.Font class......................................................................................14
5.Zaklu~ok......................................................................................16

-1-
1.Voved

Vo dene{no vreme se razvieni golem broj na programi koi im


ovozmo`uvaat na korisnicite da kreiraat se {to ke im dojde na pamet.Skoro
site moderni programi vo sebe sodr`at nekoi vidovi na grafika ili
animacii.Takov e i JAVA programskiot jazik.JAVA vo sebe sodr`i posebna
klasa za grafika.Ovaa klasa e tolku dobro razviena {to mu nudi mnogu
razli~ni metodi na programerot.Vo ovie metodi pak se vklu~eni golem broj
na alatki za crtawe na re~isi site osnovni formi.
Klasata so grafika vo JAVA e poddr`ana so 2D grafika.Ovaa nova
klasa za koja{to mo`e da se ka`e deka e mnogu podobra im nudi na
programerite pove}e kontrola vo geometrijata,koordiniranata
transformacija,kolor menaxmentot iv o tekstualnite formi.
Me|utoa ovde mo`e da se postavi i pra{aweto za toa {to pretstavuva
grafikata vo JAVA.Na ova pra{awe mo`e da mu se dade odgovor bez mnogu
razmisluvawe.Grafikata vo JAVA mo`e da se zamisli kako koja i da e slika
napravena so JAVA komponentite.Ovie da gi nare~eme osnovni komponenti
gi sodr`at site AWT komponenti i site SWING komponenti.
Spored toa mo`e da se zaklu~i deka JAVA nudi bogata kolekcija od
klasi koi {to slu`at za kreirawe na grafika.
Vo ovoj del nie }e se zadr`ime i }e objasnime 4 klasi od AWT paketot
koi se mnogu korisni,a spored toa mo`e da se ka`e i deka najmnogu se
koristat.Toa se slednite klasi:
- grafika
- 2D grafika
- boja
- bukvi
Vo delovite ponatamu sleduva detalno objasnuvawe na sekoja od
pogorenavedenite klasi.

-2-
2.Klasa za grafika

Klasata za grafika vo JAVA e abstraktna.Kako jazik koj se izvr{uva


na platformi,JAVA ne mo`e da go vovede potrebniot kod za pravilno
rakuvawe so sekoj grafi~ki sistem.Pa poradi ovaa pri~ina java virtuelnata
ma{ina mora da ja vovede ovaa klasa kako abstraktna.Promenlivata
implementacija na klasata za grafika }e bide pravilno rakovodena se
dodeka programerot se dr`i do metodite koi {to se definirani vo samata
klasa.
Abstraktnite klasi ne se,a i nemo`at da bidat neposredni.Zatoa koga
programerot raboti so ovaa klasa mora da ja povikuva kako objekt od
komponentot,koj e definiran so koristewe na metodot vo slednata forma:
component.getGraphics();
Ovoj metod e definiran i vra}a objekt.Pa poradi vakvata pri~ina sekoja
klasa koja e podklasa na Component mo`e da bide nadcrtana.
Me|utoa programerite rabotat so kontekstot na grafika,koj e AWT
implementacija na metodite definirani vo klasata za grafika.Me|utoa vo
su{tina mo`e da se objasni deka kontekstot na grafika e WRAPPER
prezentacija na povr{inata na komponentot.Crtaweto nikoga{ ne
funkcionira direktno na povr{inata na komponentot,tuku na kontekstot na
grafika,koj crta na povr{inata na komponentot.
Otkako komponentot }e se nacrta,ako posakame mo`eme i da go
oboime.Pri boeweto na komponenetite se upotrebuvaat dva metoda.Ako
komponentot e ~len na Swing paketot, metodot }e bide definiran na
sledniot na~in:
public void paintComponent(Graphics g)
inaku,metodot }e bide definiran kako:
public void paint(Graphics g)
Kontekstot na grafika mo`e da bide poddr`an od komponentot ili
slikata so koja so koja {to sakame da raborime.Kako i voobiaeno,se
pre~ekoruva metodot na boewe za toj objekt.
So sledniot kod e opi{an eden ednostaven primer:

public void paintComponent(Graphics g)


{
super.paintComponent(g);//ova }e ja precrta pozadinata
}

Ako pak komponenetot {to sakame da go oboime e podklasa na


Container,toga{ mo`e da se upotrebi sledniot metod:

public void paint(Graphics g)


{

-3-
super.paint(g);//ramkata mo`e da ima problemi so //obnovuvaweto na
slikata na ekranot bez prvo da go //povika super metodot
}

Vo slednata tabela se napi{ani golem broj na klasi dostapni vo AWT


paketot za kreirawe na grafika.Nekoi od metodite se dostapni i vo samata
klasa za grafika.

sl.1:Hierarhija na AWT klasata

Koga crtame grafi~ki elementi potrebno e da gi odreduvame na


povr{inata so pomo{ na koordinaten sistem.Zatoa koordinatniot sistem
koj se upotrebuva za rasporeduvawe na grafikata e usoglasen so
kompjuterskiot grafi~ki koordinator od vidot (x,y), kade po~etokot (0,0) e
vo gorniot lev agol.H se zgolemuva za eden za sekoj piksel koj e pomesten
nadole od po~etniot (0,0).Na slednata slika e pretstaveno pogore
opi{anoto.

-4-
sl.2:Koordinaten sistem za pretstavuvawe na grafika

So sledniot primer grafi~ki }e ja opi{eme Hello World programata.

import java.awt.*;
import java.awt.event.*;
import java.awt.Window.*;
import javax.swing.*;

class PaintingStuff extends JPanel


{
PaintingStuff()
{
}
//AWT go sproveduva kontekstot na grafika vo ramka
//kako parametar na kodot na boewe
public void paintComponent(Graphics g)
{
super.paintComponent(g);
g.setColor(Color.blue);//predninata mora da bide
//razli~na od zadninata ili ne }e mo`e da se
//vidi rezultatot
g.drawString(“Hello World”,70,100):
}
}

JPanel koj {to be{e upotreben vo prethodniot primer mora da bide dodaden
na JFrame.So naredniot primer }e bide opi{ano i toa.

import java.awt.*;
import java.awt.event.*;
import java.awt.Window.*;
import javax.swing.*;

class StartPaintingStuff extends JFrame


{

-5-
PaintingStuff pStuff=new PaintingStuff();
StartPaintingStuff()
{
setupGUI();
}
private void setupGUI()
{
Container c=getContentPane();
c.setLayout(new BorderLayout());
c.add(BorderLayout.CENTER.pStuff);
setSize(200,200);
setVisible(true);
}
}

Krajniot rezultat treba da bide sli~en so slika 3.

sl.3:Izlez od PaintingStuff

Najva`no za paintComponent(Graphics g) metodot e voobi~aeniot


prioritet za dostapnost na kontekstot na grafikata od
JComponent.Najva`no e da se zapomni deka za da se nacrta ramka,metodot e
paint(Graphics g).
Ponekoga{ programerite se obiduvaat da go apsorbiraat kontekstot
na grafika upotreben vo nivniot kod so upotreba na nasleden metod od
komponentot nare~en getGraphics().na ovoj na~in programerot ne e
prinuden da ostane vo specifi~niot nasleden kod.Me|utoa ovaa tehnika
mo`e da bide te{ka,a ponekogas mo`e da javi i gre{ki.No ako nekoga{ se
odlu~ime da ja koristime,toga{treba da bideme sigurni vo dobivaweto na
referenca kon kontekstot na grafika sekoga{ koga }e ja koristime.Po seto
ova mo`e da zememe i primer za startuvawe na Hello World programata bez
upotreba na najva`niot specifi~en metod kako slednoto:

import java.awt.*;
import java.awt.event.*;
import java.awt.Window.*;
import javax.swing.*;

-6-
class PaintingStuff extends JPanel
{
PaintingStuff()
{
}
private void drawSomething()
{
Graphics g=getGraphics();
g.setColor(Color.red);
g.drawSomething(“Hello World”,70,100):
}
}

drawSomething() metodot koj{to go upotrebivme vo prethodniot


primer mo`e da bide povikan na sledniot na~in:

import java.awt.*;
import java.awt.event.*;
import java.awt.Window.*;
import javax.swing.*;

class StartPaintingStuff extends JFrame


{
PaintingStuff pStuff=new PaintingStuff();
StartPaintingStuff()
{
setupGUI();
pStuff.drawSomething();
}
private void setupGUI()
{
Container c=getContentPane();
c.setLayout(new BorderLayout());
c.add(BorderLayout.CENTER.pStuff);
setSize(200,200);
setVisible(true);
}
}

Rezultatot e skoro identi~en kako prethodniot primer.Edinstvena razlika


e na~inot na koj e dobien grafi~kiot kontekst.
Iznenaduva~ki aspekt e frekvencijata so koja AWT go povikuva
paint(Graphics g) metodot.Sekogas koga }e povle~e{,promeni{ golemina,
pokrie{ ili otkrie{ nekoi delovi od prozorecot,AWT }e go koregira
negoviot grafi~ki kontekst so avtomatsko povikuvawe na paint(Graphics g)

-7-
metodot.Ovoj paint(Graphics g) metod treba da gi sodr`i site kodovi za
precrtuvawe na celokupniot komponent.Isto taka AWT mo`e da se prinudi
da go povika paint(Graphics g) metodot ako podatocite koi vlijaat na
izlezot na programata bidat promeneti.Vo ovoj slu~aj povikot na repaint()
metodot }e go prinudi AWT da go povika paint(Graphics g) metodot na
komponentite.Repaint() metodot prika`uva nekoi koregirawa,no glavno go
povikuva paintComponent(Graphics g) ili paint(Graphics g) metodot.
JAVA programerite treba da bidat zadovolni od metodite koi se
dostapni vo klasata za grafika.Vo delot {to sleduva podetalno }e bidat
opi{ani nekoi od ovie metodi.Toa se metodite:
- drawString()
- drawLine()
- drawRect()
- drawImage()

2.1.drawString() metod

Metodot drawString() vo klasata za grafika vo JAVA ovozmo`uva crtawe


na tekst koristej}i gi pravilniot font i boja vo grafi~kiot kontekst.Ovoj
metod be{e ve}e viden vo pogornite primeri.Zna~i drawString() metodot se
povikuva na sledniot na~in:
public void paint(Graphics g)
{
g.drawString(“Hello World”,70,100);
}
Prviot parametar vo ovoj primer se odnesuva na stringot koj treba da bide
oboen,a vtoriot i tretiot parametar se odnesuvaat na soodvetnite x i y vo
koordinatniot sistem.

2.2.drawLine() metod

Mo`e da se slu~i ponekoga{ klasata za grafika da se upotrebi za da


se nacrta linija ili nekolku linii koi mo`at da bidat doterani so
povikuvawe na drawLine() metodot.Sledniot aplet e primer za koristewe
na drawLine() za iscrtuvawe na zborot JAVA.

import javax.swing.*;
import java.awt.Graphics;

public class DrawLineTest extends JApplet


{
public void paint(Graphics g)
{
g.drawLine(45,75,25,75);

-8-
g.drawLine(35,75,35,115);
g.drawLine(25,115,35,115);
g.drawLine(55,75,55,115);
g.drawLine(65,75,65,115);
g.drawLine(55,75,65,75);
g.drawLine(55,85,65,85);
g.drawLine(75,75,80,115);
g.drawLine(80,115,85,75);
g.drawLine(95,75,95,115);
g.drawLine(105,75,105,115);
g.drawLine(95,75,105,75);
g.drawLine(95,85,105,85);
}
}

Ovoj primer na najednostaven na~in ni prika`uva kako metodot drawLine()


crta linija koristej}i ja pravilnata boja pome|u to~kata odredena so prvite
h i u parametri i to~kata odredena so vtorite h i u parametri.

2.3.drawRect() metod

Nekoga{ mo`e da posakame da nacrtame pravoagolnik okolu tekstot


koj sme go napi{ale za da ni izgleda poubavo.za da go napravime
toa,potrebno e da se implementira eden od metodite koi se dostapni vo
klasata za grafika.Eden od niv e i drawRect() metodot.Zna~i crtaweto na
pravoagolnik okolu tekstot se pravi so ovoj metod.Sega }e napi{eme eden
primer so koj se objasnuva ova.

import java.awt.*;
import java.awt.event.*;
import java.awt.Window.*;
import javax.swing.*;

class PaintingStuff extends JPanel


{
PaintingStuff()
{
setupGUI();
}
public void paintComponent(Graphics g)
{
super.paintComponent(g);
g.setColor(Color.blue);
g.drawString(“Hello World”,70,100);
g.drawRect(50,50,100,100);
}

-9-
}

Krajniot rezultat od ovoj primer treba da bide sli~en kako {to e dadeno na
slika 4.

sl.4:Izlez na paintingStuff(so pravoagolnik)

2.4.drawImage() metod

Vo Java mo`e da se crtaat i sliki.Toa go pravime so koristewe na metodot


drawImage().Kako seto toa mo`e da se napravi,}e bide prezentirano vo
sledniot primer.

import java.applet.Applet;
import java.awt.*;
import javax.swing.*;
public class Test1 extends JApplet
{
private Image i;
public void init()
{
i=getImage(getDocumentBase(),”9a.jpg”);
}
public void paint(Graphics g)
{
g.drawImage(i,0,0,this);
}
}

drawImage() metodot vo ovoj primer ja iscrtuva slikata na specifi~niot


po~etok(0,0),a slikata e upotrebena od fajl koristej}i povik do
getDocumentBase() funkcijata,koja go vra}a patot do slikata,vo ovoj slu~aj
“9a.jpg”.
Specifi~na karakteristika za drawImage() metodot e toa {to toj
vedna{ vra}a vrednost vo site slu~aevi.Ako slikata seu{te ne e smestena vo

- 10 -
memorijata,toga{ ovoj metod vra}a logi~ka vrednost ednakva na
neto~no.Proveruvaweto na vratenata vrednost vo ovoj metod e
neophodno.Ako vratenata vrednost e neto~no,toga{ programara treba da
po~eka za slikata da bide nacrtana.
Vo prodol`enie }e bide napi{an u{te eden primer za iscrtuvawe na
nekoja slika,me|utoa ovde toa e napraveno i so nekoi drugi doteruvawa na
pozadinata na slikata.

import java.awt.*;
import java.awt.image.*;
public class ImageUtilities
{
public static BufferedImage getBufferedImage(String
imageFile,Component c)
{
Image image=c.getToolkit().getImage(imageFile);
waitForImage(image,c);
BufferedImage bufferedImage=new BufferedImage
(image.getWidth(c),image.getHeight(c),BufferedImage.TYPE
_INT_RGB);
Graphics2D g2d=bufferedImage.createGraphics();
g2d.drawImage(image,0,0,c);
return(bufferedImage);
}
public static boolean waitForImage(Image image, Component c)
{
MediaTracker tracker=newMediaTracker(c);
tracker.addImage(image,0);
try
{
tracker.waitForAll();
}
catch(InterrruptedException ie){}
return(!tracker.isErrorAny());
}
public static boolean waitForImages(Image[] images, Component c)
{
MediaTracker tracker=new MediaTracker(c);
for(int i=0;i<images.length;i++)
tracker.addImage(images[i],0);
try
{
tracker.waitForAll();
}
catch(InterruptedException ie) {}
return (!tracker.isErroAny());

- 11 -
}
}

Izlezot od primerot e daden na slikata podolu:

sl.5.Izlez na ImageUtilities

3.Color class

Vo pogled na objektno-orientiranoto programirawe ,bojata e


objekt,koja mo`e da bide iskoristena kako svojstvo na drug objekt.Pa poradi
taa pri~ina JAVA ja sodr`i klasata za boja.Bojata mo`e da bide odredena na
mnogu na~ini.Eden od niv e RGB,koj se pravi so koristewe na metodot
color(int R,int G,int B).Drug na~in e so ednostavno opi{uvawe na
bojata.Toa se pravi na sledniot na~in:color.red.Koga }e se postavi
bojata,taa to~no odgovara na skeletot na objektot.
Objektot za bojata mo`e da bide upotreben za da se promeni tekovnata
boja na dadeniot grafi~ki kontekst od negovata standardna boja-crnata.So
sledniot kod se dasdeni tri na~ini kako da se postavi bojata na grafi~kiot
kontekst so koristewe na setColor() metodot od klasata za grafika.

public void paintComponent(Graphics g)


{
super.paintComponent(g);
g.setColor(Color.red);
g.setColor(new Color(255,0,0));
g.setColor(new Color(256*256*255));
}
A kodot e opi{an vo slednata programa:

import java.awt.*;
import java.awt.event.*;

- 12 -
import java.awt.Window.*;
import javax.swing.*;
class PaintingStuff extends JPanel
{
PaintingStuff ()
{
setupGUI();
}
public void paintComponent(Graphics g)
{
super.paintComponent(g);
g.setColor(Color.red);// M1
g.drawString("Hello World",70,100);
g.setColor(new Color(200,100,200));// M2
g.drawRect(50,50,100,100);
}
}

Krajniot rezultat treba da bide sli~en kako na slika 6:

sl.6.Izlez na PaintingStuff

Ovde mo`e da dodademe u{te eden primer za koristewe na klasata za


boja.Toa }e bide opi{ano vo sledniot kod.

import java.awt.*;
public class GradientPaintExample extends ShapeExample
{
private GradientPaint gradient =new GradientPaint(0, 0, Color.red, 175,
175, Color.yellow,true);
public void paintComponent(Graphics g)
{
clear(g);
Graphics2D g2d = (Graphics2D)g;
drawGradientCircle(g2d);

- 13 -
}
protected void drawGradientCircle(Graphics2D g2d)
{
g2d.setPaint(gradient);
g2d.fill(getCircle());
g2d.setPaint(Color.black);
g2d.draw(getCircle());
}
public static void main(String[] args)
{
WindowUtilities.openInJFrame(newGradientPaintExample(),
380, 400);
}
}

Izlezot od ovoj primer e daden na slika 7.

sl.7.Izlez

4.Font class

Klasata za boja e isto taka dostapna vo Java i raboti mnogu sli~no


kako klasata za boja.Fontot koj se koristi vo ovaa klasa e definiran so
samoto negovo ime na primer Helvetica,Times New Roman itn., so negoviot
stil bold,italic,plain itn. i so negovata golemina:10,12,14
itn.Konstruktorot na objektot za fontot gi prifa}a slednite parametri:

public void paintComponent(Graphics g)


{
super.paintComponent(g);
g.setFont(new Font("Helvetica", Font.BOLD, 15));
}

^esto pati vo slu~aite so Java mora da se ima vo predvid kako objektot za


font se preveduva od eden sistem vo drug.Za da funkcionira uspe{no na

- 14 -
sekoja platforma,Java gi ima odredeno slednite fontovi dostapni na sekoja
java virtuelna ma{ina.Toa se:
- Serif
- Sans Serif
- Monospaced
- Dialog
- Dialog Input

Me|utoa ovie fontovi ne se ograni~eni.Ako sakame mo`eme da koristime i


nekoi drugi.Taka na primer Toolkit klasata sodr`i metod {to }e gi
ovozmo`i site fontovi dostapni vo sistemot.
Odreduvaweto na fontot e prika`ano vo sledniot kod:

import java.awt.*;
import java.awt.event.*;
import java.awt.Window.*;
import javax.swing.*;
class PaintingStuff extends JPanel
{
PaintingStuff ()
{
setupGUI();
}
public void paintComponent(Graphics g)
{
super.paintComponent(g);
g.setColor(Color.red);
g.setFont(new Font("Serif", Font.BOLD +
Font.ITALIC, 20));
g.drawString("Hello World",70,100);
g.setColor(new Color(200,100,200));
g.drawRect(50,50,100,100);
}
}

Izlezot treba da bide sli~en kako na slika 8.

sl.8.Izlez od PaintingStuff

- 15 -
Zaklu~ok

Vo ovoj del bea opi{ani nekoi od tehnikite koi se upotrebuvaat za


grafi~kiot kontekst na nekoj komponent.Isto taka bea opi{ani i nekoi
metodi od klasata za grafika vo Java.Be{e ka`ano i za klasite za boja i za
font.
Pa spored celiot materijal koj be{e obraboten vo ovoj del od
Java,mo`e da se zaklu~i deka Java e eden mnogu obemen programski jazik vo
smisla na nejzinite mo`nosti.So nea mo`e da se postigne i da se napravi
re~isi se {to }e posakame.Posebno vo delot za grafika nejzinite mo`nosti
se izvonredni.Mo`e da se nacrta se i se{to.
Pa poradi ovie pri~ini Java e eden od najzastapenite programski
jazici vo svetot.

- 16 -

You might also like