Java Aplet

42
Marina Ivašić, Java 1 Java aplet Aplet je mali program koji se ne pokreće sam, nego je ugrađen u drugu aplikaciju. Razlika između apleta i standardnog programa svodi se prvenstveno na način kako se oni izvode: o standardni programi izvode se pomoću Java interpretora, o apleti se izvode u pretraživaču koji podržava Javu (Netscape Navigator, Internet Explorer, HotJava). Napomena: Java samostalne aplikacije moraju obavezno sadržavati metodu main()sa kojom uvijek počinje izvođenje programa. Apleti nemaju metodu main(), umjesto nje u apletima postoji nekoliko drugih metoda koje mogu biti pozvane u različitim trenucima izvođenja apleta. Aplet se uključuje u HTML dokument na isti način kao i slika. Kada korisnik učita Web stranicu koja sadrži aplet, pretraživač (browser) koji podržava Javu, «skine» (downloud) taj aplet sa Web servera na kojem je pohranjen, te ga pokreće i izvodi na stroju korisnika. Java interpretor potreban za izvođenje apleta sadržan je u samom browseru. Poput aplikacija, Java apleti sadrže/uključuju i sve "pomoćne klase" koje su potrebne za njihovo izvođenje. Standardna biblioteka klasa jezika Java uključuje se automatski. Java program se može koristiti kao aplet i kao samostalna aplikacija ako sadrži odgovarajuće elemente za aplikaciju i aplet. Ako se aplet izvodi kao samostalna aplikacija onda interpretor zanemaruje one elemente koji su specifični za aplet. Analogno vrijedi za slučajeve kada se standardna aplikacija koristi u ulozi apleta. Klasa Applet mora biti nadklasa svakog apleta koji će biti ugrađen u Web stranici ili prikazan pomoću Aplet preglednika (Applet Viewer). Klasa Applet pruža standardno sučelje između apleta i njihove okoline. Klasa Applet nasljeđuje ponašanje od klase Panel: java.applet Class Applet java.lang.Object java.awt.Component java.awt.Container java.awt.Panel java.applet.Applet public class Applet extends Panel Klasa Applet dio je paketa java.applet: Package java.applet

Transcript of Java Aplet

Page 1: Java Aplet

Marina Ivašić, Java 1

Java aplet

Aplet je mali program koji se ne pokreće sam, nego je ugrađen u drugu aplikaciju.

Razlika između apleta i standardnog programa svodi se prvenstveno na način kako se oni izvode:

o standardni programi izvode se pomoću Java interpretora,

o apleti se izvode u pretraživaču koji podržava Javu (Netscape Navigator, Internet Explorer, HotJava).

Napomena: Java samostalne aplikacije moraju obavezno sadržavati metodu main()sa kojom uvijek

počinje izvođenje programa. Apleti nemaju metodu main(), umjesto nje u apletima postoji nekoliko drugih

metoda koje mogu biti pozvane u različitim trenucima izvođenja apleta.

Aplet se uključuje u HTML dokument na isti način kao i slika. Kada korisnik učita Web stranicu koja sadrži

aplet, pretraživač (browser) koji podržava Javu, «skine» (downloud) taj aplet sa Web servera na kojem je

pohranjen, te ga pokreće i izvodi na stroju korisnika. Java interpretor potreban za izvođenje apleta sadržan je u

samom browseru.

Poput aplikacija, Java apleti sadrže/uključuju i sve "pomoćne klase" koje su potrebne za njihovo izvođenje.

Standardna biblioteka klasa jezika Java uključuje se automatski.

Java program se može koristiti kao aplet i kao samostalna aplikacija ako sadrži odgovarajuće elemente za

aplikaciju i aplet. Ako se aplet izvodi kao samostalna aplikacija onda interpretor zanemaruje one elemente koji su

specifični za aplet. Analogno vrijedi za slučajeve kada se standardna aplikacija koristi u ulozi apleta.

Klasa Applet mora biti nadklasa svakog apleta koji će biti ugrađen u Web stranici ili prikazan pomoću Aplet

preglednika (Applet Viewer). Klasa Applet pruža standardno sučelje između apleta i njihove okoline.

Klasa Applet nasljeđuje ponašanje od klase Panel:

java.applet Class Applet java.lang.Object

java.awt.Component

java.awt.Container

java.awt.Panel

java.applet.Applet

public class Applet extends Panel

Klasa Applet dio je paketa java.applet:

Package java.applet

Page 2: Java Aplet

Marina Ivašić, Java 2

Paket applet sadrži klase za definiranje apleta i za kreiranje sadržaja apleta. Aplet je prozor (Panel

class) sa nekoliko dodatnih metoda koje se koriste za inicijalizaciju, pokretanje i zaustavljanje

apleta.

Za učitavanje i pokretanje apleta odgovorna je aplikacija kao Web pretraživač ili okolina za razvoj

apleta.

Aplet kojeg stvaramo je podklasa klase Applet koja je sadržana u paketu java.applet i od koje nasljeđuje

ponašanje. Aplet može sadržavati razne klase, ali klasa Applet je glavna klasa koja pokreće izvođenje apleta.

Obzirom da je klasa Applet javna klasa, svaki aplet kao njena podklasa mora biti deklariran kao public:

//import java.applet.*

public class PrviAplet extends java.applet.Applet {

…… // kod

}

Klasa Applet definira dvije vrste "ponašanja" koje nasljeđuju svi apleti tako da aplet može:

o raditi kao dio preglednika (browsera), i biti u stanju prikladno reagirati na događaje kao što su

učitavanje Web stranice,

o predstaviti grafičko korisničko sučelje i adekvatno reagirati na događaje na sučelju.

Kada Java interpretor koji je ugrađen u browser, na Web stranici naiđe na Java aplet, učitava klasu tog apleta

(zajedno sa svim pomoćnim klasama koje taj aplet koristi). Browser kreira jednu instancu klase tog apleta i

poziva metode klase Applet kada je to potrebno. Na istu stranicu može uvrstiti više "kopija" istog apleta

različitog ponašanja, jer različiti apleti koji koriste iste klase, koriste različite instance tih klasa.

Konstruktor klase Applet:

Applet() Kreira aplet

Varijable klase Applet:

o Polja nasljeđena iz klase java.awt.Component (BOTTOM_ALIGNMENT, CENTER_ALIGNMENT,

LEFT_ALIGNMENT, RIGHT_ALIGNMENT, TOP_ALIGNMENT)

o Polja nasljeđena iz sučelja java.awt.image.ImageObserver (ABORT, ALLBITS, ERROR, FRAMEBITS,

HEIGHT, PROPERTIES, SOMEBITS, WIDTH)

Metode klase Applet (nenasljeđene):

void destroy()

Called by the browser or applet viewer to inform this applet that it is being reclaimed and

that it should destroy any resources that it has allocated.

AccessibleContext getAccessibleContext()

Gets the AccessibleContext associated with this Applet.

AppletContext getAppletContext()

Determines this applet's context, which allows the applet to query and affect the

environment in which it runs.

String getAppletInfo()

Returns information about this applet.

AudioClip getAudioClip(URL url)

Returns the AudioClip object specified by the URL argument.

AudioClip getAudioClip(URL url, String name)

Returns the AudioClip object specified by the URL and name arguments.

Page 3: Java Aplet

Marina Ivašić, Java 3

URL getCodeBase()

Gets the base URL.

URL getDocumentBase()

Gets the URL of the document in which this applet is embedded.

Image getImage(URL url)

Returns an Image object that can then be painted on the screen.

Image getImage(URL url, String name)

Returns an Image object that can then be painted on the screen.

Locale getLocale()

Gets the locale of the applet.

String getParameter(String name)

Returns the value of the named parameter in the HTML tag.

String[][] getParameterInfo()

Returns information about the parameters that are understood by this applet.

void init()

Called by the browser or applet viewer to inform this applet that it has been loaded into

the system.

boolean isActive()

Determines if this applet is active.

static AudioClip newAudioClip(URL url)

Get an audio clip from the given URL.

void play(URL url)

Plays the audio clip at the specified absolute URL.

void play(URL url, String name)

Plays the audio clip given the URL and a specifier that is relative to it.

void resize(Dimension d)

Requests that this applet be resized.

void resize(int width, int height)

Requests that this applet be resized.

void setStub(AppletStub stub)

Sets this applet's stub.

void showStatus(String msg)

Requests that the argument string be displayed in the "status window".

void start()

Called by the browser or applet viewer to inform this applet that it should start its

execution.

void stop()

Called by the browser or applet viewer to inform this applet that it should stop its

execution.

Metode nasljeđene od klase java.awt.Container

add, addContainerListener, addImpl, addPropertyChangeListener,

addPropertyChangeListener, applyComponentOrientation, areFocusTraversalKeysSet,

countComponents, deliverEvent, doLayout, findComponentAt, findComponentAt,

getAlignmentX, getAlignmentY, getComponent, getComponentAt, getComponentAt,

getComponentCount, getComponents, getComponentZOrder, getContainerListeners,

getFocusTraversalKeys, getFocusTraversalPolicy, getInsets, getLayout, getListeners,

getMaximumSize, getMinimumSize, getMousePosition, getPreferredSize, insets,

invalidate, isAncestorOf, isFocusCycleRoot, isFocusCycleRoot,

isFocusTraversalPolicyProvider, isFocusTraversalPolicySet, layout, list, list,

locate, minimumSize, paint, paintComponents, paramString, preferredSize, print,

printComponents, processContainerEvent, processEvent, remove, remove, removeAll,

removeContainerListener, removeNotify, setComponentZOrder, setFocusCycleRoot,

Page 4: Java Aplet

Marina Ivašić, Java 4

setFocusTraversalKeys, setFocusTraversalPolicy, setFocusTraversalPolicyProvider,

setFont, setLayout, transferFocusBackward, transferFocusDownCycle, update,

validate, validateTree

Metode nasljeđene do klase java.awt.Component

action, add, addComponentListener, addFocusListener, addHierarchyBoundsListener,

addHierarchyListener, addInputMethodListener, addKeyListener, addMouseListener,

addMouseMotionListener, addMouseWheelListener, bounds, checkImage, checkImage,

coalesceEvents, contains, contains, createImage, createImage, createVolatileImage,

createVolatileImage, disable, disableEvents, dispatchEvent, enable, enable,

enableEvents, enableInputMethods, firePropertyChange, firePropertyChange,

firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange,

firePropertyChange, firePropertyChange, firePropertyChange, getBackground,

getBaseline, getBaselineResizeBehavior, getBounds, getBounds, getColorModel,

getComponentListeners, getComponentOrientation, getCursor, getDropTarget,

getFocusCycleRootAncestor, getFocusListeners, getFocusTraversalKeysEnabled,

getFont, getFontMetrics, getForeground, getGraphics, getGraphicsConfiguration,

getHeight, getHierarchyBoundsListeners, getHierarchyListeners, getIgnoreRepaint,

getInputContext, getInputMethodListeners, getInputMethodRequests, getKeyListeners,

getLocation, getLocation, getLocationOnScreen, getMouseListeners,

getMouseMotionListeners, getMousePosition, getMouseWheelListeners, getName,

getParent, getPeer, getPropertyChangeListeners, getPropertyChangeListeners,

getSize, getSize, getToolkit, getTreeLock, getWidth, getX, getY, gotFocus,

handleEvent, hasFocus, hide, imageUpdate, inside, isBackgroundSet, isCursorSet,

isDisplayable, isDoubleBuffered, isEnabled, isFocusable, isFocusOwner,

isFocusTraversable, isFontSet, isForegroundSet, isLightweight, isMaximumSizeSet,

isMinimumSizeSet, isOpaque, isPreferredSizeSet, isShowing, isValid, isVisible,

keyDown, keyUp, list, list, list, location, lostFocus, mouseDown, mouseDrag,

mouseEnter, mouseExit, mouseMove, mouseUp, move, nextFocus, paintAll, postEvent,

prepareImage, prepareImage, printAll, processComponentEvent, processFocusEvent,

processHierarchyBoundsEvent, processHierarchyEvent, processInputMethodEvent,

processKeyEvent, processMouseEvent, processMouseMotionEvent,

processMouseWheelEvent, remove, removeComponentListener, removeFocusListener,

removeHierarchyBoundsListener, removeHierarchyListener, removeInputMethodListener,

removeKeyListener, removeMouseListener, removeMouseMotionListener,

removeMouseWheelListener, removePropertyChangeListener,

removePropertyChangeListener, repaint, repaint, repaint, repaint, requestFocus,

requestFocus, requestFocusInWindow, requestFocusInWindow, reshape, setBackground,

setBounds, setBounds, setComponentOrientation, setCursor, setDropTarget,

setEnabled, setFocusable, setFocusTraversalKeysEnabled, setForeground,

setIgnoreRepaint, setLocale, setLocation, setLocation, setMaximumSize,

setMinimumSize, setName, setPreferredSize, setSize, setSize, setVisible, show,

show, size, toString, transferFocus, transferFocusUpCycle

Aplet prolazi kroz pet osnovnih faza:

1. Inicijalizacija

- prva faza koja se događa jednom

- odvija se prilikom učitavanja apleta u pretraživač

- obično obuhvaća stvaranje objekata potrebnih u apletu, učitavanje slika, definicija parametara

public void init() {

…… // kod // Da bi se u apletu definiralo inicijalizaciju, treba nadjačati metodu init()

}

2. Pokretanje

- aplet se pokreće prilikom pristupa web stranici na kojoj se nalazi (nakon inicijalizacije ili nakon što je

bio zaustavljen npr. kada je korisnik pritisnuo link na stranici i prešao na drugu stranicu)

Page 5: Java Aplet

Marina Ivašić, Java 5

- ova faza može se zbiti više puta za vrijeme trajanja životnog ciklusa jednog apleta

public void start() {

…… // kod // Ako se želi definirati način pokretanja apleta, treba nadjačati metodu start()

}

3. Ispisivanje na ekran

- nastupa svaki put kada aplet nešto prikazuje na ekran u prozor pretraživača (to može biti tekst, crtež, slika,

ili obnavlja sadržaj ekrana

- ova faza može se zbiti više puta za vrijeme trajanja životnog ciklusa apleta, a aktivira se odmah nakon

pokretanja apleta, tj. nakon inicijalizacije, kod povratka na stranicu i svake obnove sadržaja ekrana

public void paint(Graphics g) {

…… // kod // Da bi se na ekranu nešto prikazalo treba nadjačati metodu paint()

}

Za razliku od prijašnjih metoda, metoda paint() nasljeđena je od klase Container (nadklase klase Applet) i ima jedan

argument. Argument metode paint() je instanca klase Graphics koju kreira browser koji izvršava aplet. Da bi

pretraživač to mogao učiniti, klasa Graphics koja je dio java.awt paketa mora biti importirana na početak datoteke

koja sadrži izvorni kod apleta naredbom:

import java.awt.Graphics;

ili ako će se u apletu koristiti veći broj klasa iz is tog paketa (dostupne su sve njegove klase):

import java.awt.*;

4. Zaustavljanje

- nastupa svaki put kada korisnik napusti web stranicu koja sadrži aplet ili kada se aplet sam zaustavi

- ova faza može se zbiti više puta za vrijeme trajanja životnog ciklusa jednog apleta

public void stop() {

…… // kod // Ako se želi definirati način zaustavljanja apleta, treba nadjačati metodu stop()

}

5. Uništavanje

- faza koja se događa samo jednom kada pretraživač završava sa izvršenjem aplikacije

- metoda destroy uklanja suvišne objekte, čisti memoriju,… na stroju korisnika prije nego aplet bude

izbrisan sa stroja

public void destroy() {

…… // kod // Nije potrebno nadjačavati metodu destroy(), ali može se učiniti

}

Java sadrži automatski "sakupljač smeća" (garbage collector) koji upravlja memorijom i oslobađa one djelove

memorije koji nisu zauzeti nekim "aktivnim" programom. Stoga, u pravilu nije potrebno koristiti metodu destroy()

koja, radi to isto.

Faze i odgovarjuće metode:

import java.applet.*;

import java.awt.*;

public class KosturApleta extends Applet {

public void init() { // korisnik pristupa web stranici s apletom

// inicijalizacijske naredbe

}

public void start() { // aplet je učitan i spreman za pokretanje

// naredbe koje se izvršavaju prilikom pokretanja

}

Page 6: Java Aplet

Marina Ivašić, Java 6

public void paint(Grafics g) { // aplet je aktivan

// naredbe koje utječu na ispis na ekranu

}

public void stop() { // korisnik napušta stranicu ali ne i pretraživački program

// naredbe koje se izvršavaju prilikom zaustavljanja

}

public void destroy() { // korisnik napušta pretraživački program

// naredbe koje se izvršavaju na samom kraju života apleta

}

Primjer:

import java.awt.Graphics;

import java.awt.Font;

import java.awt.Color;

public class Aplet1 extends java.applet.Applet {

Font f = new Font("TimesRoman", Font.BOLD, 36);

public void paint(Graphics g) { // nadjačava se metoda paint()

g.setFont(f); // definira se font kao f instanca klase Font

g.setColor(Color.red); // definira se boja kao varijabla red klase Color

g.drawString("Pozdrav", 5, 40); // ispis stringa na poziciji 5, 40

}

}

Objašnjenje: U ovom apletu nadjačava se metoda paint(), a metode init(), start() i stop() nisu nadjačane jer nije bilo

potrebno. Objekt g je instanca klase Graphics koji se prenosi metodi paint(). Objekt klase Font sadržan je u varijabli

instance f, dok je objekt koji predstavlja crvenu boju pohranjen u varijabli red klase Color.

Ugrađivanje apleta u Web stranicu

Kompajliranjem izvornog koda apleta dobiju se datoteke sa ekstenzijom class (class file) za svaku

definiranu klasu. U HTML stranicu dodaje se poziv apleta pomoću HTML naredbe <APPLET>.

Naredba <APPLET> je posebno proširenje jezika HTML koje je namijenjeno uključivanju Java apleta u Web

stranice. Sve što se nalazi između naredbe <APPLET> i </APPLET> predstavlja blok kojim se

određuje način izvršenja java apleta.

Npr. za raniji primjer poziv apleta Aplet1 :

<HTML>

<HEAD>

<TITLE> Prvi aplet </TITLE>

</HEAD>

<BODY>

Page 7: Java Aplet

Marina Ivašić, Java 7

<P>Poruka na HTML stranici

<BR>

<APPLET CODE="Aplet1.class" WIDTH=500 HEIGHT=100>

Pretraživač koji ne podržava javu će ispisti ovu poruku.

</APPLET>

</BODY>

</HTML>

Za dani primjer, naredba <APPLET> sadrži tri atributa:

1) CODE - daje ime datoteke koja sadrži prevedenu glavnu klasu apleta,

2) WIDTH - određuje širinu prozora koji je namijenjen prikazu rezultata rada apleta,

3) HEIGHT - određuje/definira visinu istog prozora apleta.

Datoteka tipa class glavne klase apleta se sa atributom CODE postavlja na HTML dokument, a obično se smješta

u isti direktorij u kojem se nalazi Web stranica koja poziva taj aplet. Atributi WIDTH i HEIGHT trebaju biti

zadani, jer browser mora znati na koji (i koliki) prostor treba ispisati rezultat rada apleta. Osim nvedenih atrubuta

blok <APPLET> može sadržavati i tekstualne poruke ili slike (tj. referencu na datoteku koja sadrži sliku) koje će

se prikazati na ekranu korisnika u slučaju da browser nije u stanju izvesti dani aplet. Bez takve obavijesti

uključene u blok <APPLET>, browser koji ne podržava Javu, neće ničim korisniku dati do znanja da stranica

koju upravo gleda sadrži i aplet koji nije prikazan na ekranu.

Postavljanje apleta na Web

Da bismo aplet učinili dostupnim cijelom Webu, aplet trebamo prikladno pohraniti na neki Web server.

Apleti se pohranjuju na isti način kao i HTML dokumenti, tj. datoteka sa prevedenim apletom treba biti

smještena na direktorij koji je dostupan Web serveru; obično je to isti direktorij na kojem se nalazi i

Web/HTML stranica koja sadrži/poziva dani aplet. Pritom, pored datoteke koja sadrži "glavnu klasu"

apleta, na isti način treba pohraniti i ostale datoteke ekstenzije class koje koristi dani aplet (izuzev onih

klasa koje su dio standardne biblioteke jezika Java).

Sigurnost: S obzirom da se apleti izvode (kao programi) na računalu korisnika Web stranice, zbog sigurnosti korisnika,

nužno je podesiti parametre pretraživača vezana za izvođenje apleta i/ili uvesti neka ograničenja u radu apleta.

Aplet ne smije moći učiniti nijednu od slijedećih stvari:

- čitati ili zapisivati datoteke na korisnikov sustav (file system),

- komunicirati sa drugim Internet stanicama osim one preko koje se pristupilo apletu,

- pokretati nikakve programe na sustavu korisnika Web stranice (tj. na sustavu na kojem "gostuje").

Verzija Jave i preglednici Prilikom pisanja apleta, treba imati na umu da će se apleti uspješno izvesti samo na onim preglednicima koji

podržavaju verziju Jave koja je korištena u izradi apleta. Preporučuje se koristiti standardne elemente jezika, jer to

garantira da će takvi apleti raditi na svim browserima koji podržavaju Javu. Jedini alat koji podržava najnovije

verzije apleta je JavaSoft-ov appletviewer, ali za razliku od preglednika, appletviewer pokazuje samo aplet (tj.

rezultat njegova rada), ali ne i HTML dokument u koji će taj aplet biti ugrađen.

Sučelja u klasi Applet

- AppletContext (interakcija sa pretraživačem; kontekst apleta = trenutno stanje apleta tijekom izvršenja)

- AppletStub (koristi se prilikom pisanja menia apleta; sve metode ovog sučelja definirane su i Appletu)

- AudioClip (metode za upravljenje zvučnim datotekama)

Page 8: Java Aplet

Marina Ivašić, Java 8

Grafika

Većina metoda koje se odnose na grafiku (crtanje linija, pravokutnika, elipsa,..) definirane su u klasi

Graphics koja je dio paketa java.awt i koja apletu postaje dostupna naredbom

import java.awt.Grafics;

Grafičke operacije najčešće se obavljaju u metodi paint:

public void paint(Graphics g) { // instancu klase Grafic g koristi se za obavljanje grafičkih operacija

Napomena: Za koordinatni sustav uzima se IV kvadrant Kartezijevog koordinatnog sustava (tj. ishodište

(0, 0) nalazi se u gornjem lijevom kutu prozora apleta, vrijednost koordinate x raste prema desno, a

vrijednost koordinate y prema dolje). Mjerne jedinice su pixeli (ekranske točkice).

Crtanje osnovnih likova

Postoje dvije vrste metoda za crtanje koje su primjenljive na većinu oblika/likova koji se mogu nacrtati u okviru

nekog apleta, i to:

- metode koje crtaju "konture" nekog objekta, i

- metode koje "ispunjavaju" lik sa zadanom bojom.

Linije

Metoda drawLine() koristi se za crtanje linije između dviju točaka. Ima četiri argumenta: koordinate x1 i y1

početne točke, te koordinate x2 i y2 završne točke linije. Debljina linije između točaka (x1,y1) i (x2,y2) je jedan

piksel. Najniža granična vrijednost linije je točka (početna i završna točka su iste).

drawLine(x1, y1, x2, y2); // crta liniju između točke (x1,y1) i (x2,y2).

drawLine(x1, y1, x1, y1); // crta točkicu (x1,y1).

Npr. import java.awt.Graphics;

public class Linija extends java.applet.Applet {

public void paint(Graphics h) {

h.drawLine(15,25, 50, 55); // crta liniju od točke (15,25) do točke (50,55)

h.drawLine(5,10, 5, 10); // crta točku (5,10)

}

}

Zadatak. Napiši aplet koji crta pramen pravaca, linije od točke (35+p,35) do točke(150,155) s tim da je p>=20 i

p<= 400 i p se povećava za 20. Linije su zelene boje.

import java.awt.*;

public class Applet1 extends java.applet.Applet {

public void paint(Graphics g) {

g.setColor(Color.green);

for (int p=20; p<=400; p+=20)

g.drawLine(35+p,35, 150, 155);

}

}

Page 9: Java Aplet

Marina Ivašić, Java 9

Zadatak. Napiši aplet koji crta devet centralno postavljenih crvenih pravokutnika tako da je svaki sljedeći pravokutnik za 10

točaka manji od prethodnog.

import java.awt.*;

import java.applet.*;

public class Applet1 extends Applet {

public void paint(Graphics g) {

g.setColor(Color.red);

for (int p=10; p<100; p+=10) {

g.drawLine(15+p,50+p, 250-p, 50+p);

g.drawLine(15+p,50+p, 15+p, 250-p);

g.drawLine(15+p,250-p,250-p,250-p);

g.drawLine(250-p,50+p,250-p, 250-p);

}

}

}

Pravokutnici

Postoje dvije grafičke metode za crtanje pravokutnika; jedna metoda crta pravokutnike, a druga pravokutnike sa

zaobljenim kutevima. Pravokutnici obiju vrsta mogu biti nacrtani kao "prazni likovi" ili pak ispunjeni bojim.

Konture/lik pravokutnika crta metoda drawRect(), dok metoda fillRect() crta "ispunjen" pravokutnik. Obje

metode imaju četiri argumenta, i to koordinate gornjeg lijevog kuta, širinu pravokutnika, i visinu pravokutnika.

Pravokutnike sa zaobljenim kutovima crtaju metode drawRoundRect() koja prikazuje konture pravokutnika i

fillRoundRect() koja crta ispunjen pravokutnik (sa zaobljenim uglovima). Te metode sadrže četiri osnovna

argumenta koji određuju lijevi gornji ugao, širinu i visinu pravokutnika, te još dva argumenta pomoću kojih se

definira način zaobljenja uglova, tj. pravokutnik širine sz, visine vz u kojem su zaobljeni rubovi. Najveća

granična vrijednost zaobljenja je kada pravokutnik postane krug/ elipsa, a najmanja kada je pravokutnik.

drawRect(x, y, s, v); // pravokutnik sa gornjim lijevim kutom u (x,y), širine s, visine v

fillRect(x, y, s, v); // ispunjen pravokutnik sa gornjim lijevim kutom u (x,y), širine s, visine v

drawRoundRect(x, y, s, v, sz, vz); // pravokutnik sa gornjim lijevim kutom (x,y), širine s, visine v,

sa zaobljenim kutem u pravokutniku širine sz, visine vz

fillRoundRect(x, y, s, v, sz, vz); // ispunjen pravokutnik sa gornjim lijevim kutom (x,y), širine s,

visine v, sa zaobljenim kutem u pravokutniku širine sz, visine vz

Page 10: Java Aplet

Marina Ivašić, Java 10

draw3DRect(x, y, s, v, true|false); // 3D pravokutnik sa gornjim lijevim kutom u (x,y), širine s,

visine v, izbočen za true| udubljen za false

fill3DRect(x, y, s, v, true|false); // ispunjen pravokutnik sa gornjim lijevim kutom u (x,y), širine

s, visine v, izbočen za true| udubljen za false

Npr. import java.awt.Graphics;

public class Pravokutnik extends java.applet.Applet {

public void paint(Graphics g) {

g.drawRect(5,5, 70, 80); // pravokutnik u točki (5,5) širine 70, visne 80

g.fillRect(50,100, 50, 50); // popunjen kvadrat u točki (50,100) širine 50, visne 50

}

}

Zadatak. Napiši aplet koji crta 10 stepenica.

import java.awt.*;

public class Applet1 extends java.applet. Applet {

public void paint(Graphics g){

for(int i=0;i<10;i++)

g.drawRect(12,12+i*35,35+i*35,35);

}

}

Zadatak. Napiši aplet koji crta 11 kvadrata od kojih svaki ima zakrivljene kuteve u kvadratu širine 10, visine 10 tako da se svaki

sljedeći kvadrat povećava za 20 točaka i po širini i po visini. Kvadrati su crvene boje.

import java.awt.*;

import java.awt.Graphics;

public class Applet1 extends java.applet.Applet {

public void paint(Graphics g) {

g.setColor(Color.red);

for(int i=0; i<=200; i+=20)

g.drawRoundRect(100-i/2,100-i/2, 60+i, 60+i, 10,10);

}

}

Elipse

Page 11: Java Aplet

Marina Ivašić, Java 11

Metode drawOval() i fillOval() služe za crtanje krugova i elipsa. Imaju četiri argumenta: koordinate (x, y)

gornjeg lijevog kuta pravokutnika širine s, visine v u kojem je elipsa upisana.

drawOval (x, y, s, v); // elipsa sa gornjim lijevim kutom u (x,y), u pravokutniku širine s, visine v

fillOval (x, y, s, v); // ispunjena elipsa sa gornjim lijevim kutom (x,y), u pravokutniku širine s, visine v

Npr. import java.awt.Graphics;

public class Elipsa extends java.applet.Applet {

public void paint(Graphics g) {

g.drawOval(15,15, 70, 80); // elipsa u točki (15,15) u pravokutniku širine 70, visne 80

g.fillOval(50,100, 50, 50); // popunjen krug u točki (50,100) u kvadratu širine 50, visne 50

}

}

Zadatak. Napiši aplet koji crta 10 kružnica tako da se svaka sljedeća povećava za 10 točaka.

import java.applet.*;

import java.awt.*;

public class Applet1 extends Applet{

public void paint(Graphics g){

for(int i=10;i<110;i+=10){

g.drawOval(100-i/2,100-i/2,10+i,10+i);

}

}

}

Lukovi

Luk se tretira kao dio elipse koji je prikazan samo djelomično. Lukovi se crtaju pomoću metoda drawArc() i

fillArc(). Te metode imaju šest argumenata:

- koordinate (x, y) gornjeg lijevog kuta pravokutnika širine s, visine v, kao kod elipse;

- kut na pk stupnju trigonometrijske kružnice na kojem luk počinje (tj. točka u kojoj luk počinje);

- kut koji luk zatvara, k broj stupnjeva luka počev od početne točke luka.

Prva četiri argumenta ista su kao kod elipse. Početni kut luka može poprimiti vrijednost se od 0 do 359 stupnjeva,

u smijeru obrnutom od smijera kretanja kazaljki na satu. Broj stupnjeva luka može se kretati od 0 do 359

stupnjeva, ili do -359 stupnjeva.

drawArc(x, y, s, v, pk, k ); // luk sa gornjim lijevim kutom u (x,y), u pravokutniku širine s, visine v,

počinje na pk stupnju trigonometrijske kružnice i iznosi k stupnjeva

fillArc(x, y, s, v, pk, k); // isječak sa gornjim lijevim kutom u (x,y), u pravokutniku širine s, visine v,

počinje na pk stupnju trigonometrijske kružnice i iznosi k stupnjeva

Page 12: Java Aplet

Marina Ivašić, Java 12

Npr. import java.awt.Graphics;

public class Luk extends java.applet.Applet {

public void paint(Graphics g) {

g.drawArc(20, 25, 315, 150, 5, -195); // luk u točki (20,25) u pravokutniku širine 315, …

g.fillArc(50,100, 50, 50, 0 , 180); // popunjen kružni isječak (50,100)

}

}

Zadatak. Napiši aplet koji crta lukove koji se smanjuju i koji počinju na 90 stupnju trigonometrijske kružnica i iznose 180

stupnjeva.

import java.awt.*;

public class Applet1 extends java.applet.Applet {

public void paint(Graphics g) {

for(int i=0; i<=200; i+=5){

Color b = new Color(i,i*2,i);

g.setColor(b);

g.drawArc(50+i/2,50+i/2, 50-i, 50-i,90,180);

}

}

}

Primjer povezanih lukova: Valovi

Koristeći slične lukove, crtaju se "valovi" kao dio elipse upisna u pravokutnik širine 10 i visine 10 točkica

(kvadrat, pa je elipsa kružnica) sa početkom na 0 stupnjeva i veličine -180 stupnjeva (što znači da luk postaje

"donja polukružnica"). Da bi se nacrtalo valove, koordinate x i y (tj. koordinate lijevog gornjeg kuta pravokutnika

u kojem se luk nalazi) se trebaju mijenjati (for petlje).

for (int ax = 50; ax < 150; ax += 10)

for (int ay = 120; ay = 120; ay < 320; ay += 10)

screen.drawArc(ax, ay, 10, 10, 0, -180);

Poligoni

Poligoni se crtaju pomoću metoda drawPolygon() i fillPolygon(). Potrebno je navesti niz koordinata, tj. vrhove

poligona koji su spojeni linijom tako da su koordinate završne točke jedne linije ujedno koordinate početne točke

druge linije poligona.

Koordinate poligona mogu se definirati na više načina, a najčešće se definira cjelobrojni niz koordinata na osi x

i cjelobrojni niz koordinata na osi y (integer arrays). Nadalje, potrebno je zadati i broj točaka u poligonu koji

mora odgovarati broju elemenata u nizovima sa koordinata na osi x i y.

Page 13: Java Aplet

Marina Ivašić, Java 13

Ako su prva i zadnja točka poligona jednake, poligon je zatvoren, a u suprotnom je otvoren. Metoda fillPolygon()

automatski zatvara poligon bez da eksplicitno dodamo točku koja će "spojiti" početak i kraj poligona.

drawPolygon(x, y, vrh); // poligon je zadan nizom koordinata vrhova (x[], y[]) i brojem vrhova vrh

// gdje će susjedni vrhovi biti povezani crtama

fillPolygon (x, y, vrh); // ispunjen poligon je zadan nizom koordinata vrhova (x[], y[]) i brojem

// vrhova vrh gdje će susjedni vrhovi (i prvi i zadnji) biti povezani crtama; a

// poligon automatski zatvoren

Kreiranje poligona korištenjem nizova koordinata:

import java.awt.Graphics;

public class Poligon extends java.applet.Applet {

public void paint(Graphics g) {

int x[] = { 10, 20, 30, 40, 50 }; // x koordinata vrhova poligona

int y[] = { 15, 25, 35, 45, 55 }; // y koordinata vrhova poligona

int vrh = x.length; // broj točaka poligona

g.drawPolygon(x, y, vrh); // poligon

g.fillPolygon(x, y, vrh); // popunjen i zatvoren poligon

}

}

Zadatak. Napiši aplet koji crta trokut koji je popunjen crvenom bojom.

import java.awt.*;

public class Applet1 extends java.applet.Applet {

public void paint(Graphics g) {

int x[] = { 50,100,150 };

int y[] = { 100, 5,100 };

int vrh = x.length; // broj točaka poligona

g.setColor(Color.red);

g.fillPolygon(x, y, vrh); // popunjen i zatvoren trokut

}

}

Zadatak. Napiši aplet koji crta šesterokut koji je popunjen crvenom bojom.

import java.awt.*;

public class Applet1 extends java.applet.Applet {

public void paint(Graphics g) {

int x[] = { 50,100,150,200,150,100 };

int y[] = { 150, 200,200,150,100,100 };

int vrh = x.length; // broj točaka poligona

g.setColor(Color.red);

g.fillPolygon(x, y, vrh); // popunjen i zatvoren šesterokut

Page 14: Java Aplet

Marina Ivašić, Java 14

}

}

Kreiranje poligona korištenjem objekta:

Objekt, instancu klase Polygon kreiramo koristeći konstruktor sa ili bez parametara:

Polygon poly = new Polygon();

Poligonu možemo dodavati nove točke pomoću metode addPoint(). Na primjer:

poly.addPoint(60, 65);

Kreirani objekt klase Polygon možemo nacrtati pomoću metoda drawPolygon() ili fillPolygon() koje imaju jedan

argument, objekt klase Poygon (u gornjem primjeru poly).

import java.awt.Graphics;

import java.awt.Polygon;

public class Poligon2 extends java.applet.Applet {

public void paint(Graphics g) {

int x[] = { 20, 30, 40, 50 };

int y[] = { 25, 35, 45, 55 };

int vrh = x.length; // broj točaka poligona

Polygon poly = new Polygon(x,y,vrh); // kreiran poligon pozivom klase java.awt.Polygon

poly.addPoint(10, 15); // dodajemo mu novu točke pomoću metode addPoint().

g.drawPolygon(poly); // argument je objekt poly koji je ranije kreiran i oblikovan

g.fillPolygon(poly); // popunjen i zatvoren poligon

}

}

Tekst i fontovi

Prije ispisa na ekranu potrebno je stvoriti objekti klase Font koji sadrže ime, stil (PLAIN -obično, BOLD-

masno pismo, ITALIC- kurziv i njihove kombinacije) i veličinu (u pikselima) fonta koji će se koristiti za

ispis.

Prilikom formiranja objekta klase Font, definiraju se argumenati konstruktora:

Font f = new Font("ime fonta", stil, veličina);

Npr. Font ft = new Font("Dialog", Font.BOLD + Font.ITALIC, 24);

Da bi se font koji je prethodno definiran, i koristio prilikom ispisa, koristi se metoda setFont() iz klase

Graphics. Metoda setFont() ima kao argument objekt, instancu klase Font (ft) i postavlja izgled zapisa

kako je definirano u tom objektu:

Page 15: Java Aplet

Marina Ivašić, Java 15

setFont(ft); //setira predhodno definirani font ft

drawString(tekst, x, y); // ispis tekst u prozoru apleta sa trenutno setiranim fontom na koordinatama x,y

Metoda drawString() ispisuje tekst na ekran. Prvi parametar je tekst (string) koji će se ispisti na ekranu, a

druga dva su su koordinate na kojima će početak tekst biti ispisan.

Ako definirani font postoji na sustavu na kojem se aplet izvodi, koristiti će se prilikom ispisa. Ako trenutno

nije odabran nijedan font, metoda drawString() koristi predefiniran font (default). Novi font može biti

odabran u bilo kojem trenutku, pomoću metode setFont().

Primjer.

import java.awt.Graphics;

import java.awt.Polygon;

public class Tekst extends java.applet.Applet {

public void paint(Graphics g) {

Font f = new Font("TimesRoman", Font.PLAIN, 72);

g.setFont(f);

g.drawString("Dobar dan.", 10, 100);

}

}

Informcije o različitim fontovima pružaju metode klase Font i klase FontMetrics. Jedna od metoda je

stringWidth(String), koja za dani objekt klase String (tj. za dani niz znakova) izračunava ukupnu dužinu

toga niza, u točkicama.

Font f = new Font("Courier", Font.BOLD, 18);

FontMetrics fm = getFontMetrics(f); //instanca klase FontMetrics za objekt klase Font

String s = "So long, and thanks for all the fish.";

int x = fm.stringWidth(s); // dužina niza s u pikselima

Boja

U Javi se definiraju boje u skladu sa RGB sistem (prema prvim slovima od Red, Green, Blue). U tom

sistemu, boja se određuje na osnovu zastupljenosti svake od triju osnovnih boja (može biti predstavljena

cijelim brojem od 0 do 255). Crna boja predstavlja se sa trojkom (0, 0, 0), a bijela boja je trojka (255, 255,

255).

Java podržava rad i druge sustave boja. Ako izlazna jedinica (npr. ekran ili printer) ili Web stranica ne može

prikazati boje koje se mogu definirati u sustavu Java, prikazuje njihove aproksimacije.

Page 16: Java Aplet

Marina Ivašić, Java 16

Za rad sa bojama koriste se klase Color i ColorSpace koje su sadržane u java.awt paketu. Te klase

omogućavaju odabir/postavljanje (set) boje u kojoj se ispisuje ili crta neki tekst/lik na ekranu, te odabir boje

pozadine (background).

Da bi se odabralo tekuću boju ispisa izlaza, potrebno je:

- kreirati objekt Color kojim se definira željenu boju: Color boja = new Color(255, 204, 102);

- koristiti neku od standardnih boja koje su dostupne iz klase Color (varijable klase):

black (0, 0, 0) cyan (0, 255, 255) gray (128, 128, 128) green (0, 255, 0)

blue (0, 0, 255) darkGray (64, 64, 64) yelow (255, 255, 0) magenta (255, 0, 255)

orange (255, 200, 0) pink (255, 175, 175) red (255, 0, 0) white (255, 255, 255)

Boja se postavlja pomoću metode setColor() koja je definirana u klasi Graphics. Mora biti pozvana na

instanci klase Graphics koja predstavlja prostor u koji se vrši pisanje/crtanje (argument metode paint()).

setColor() //setira boju na objektu koji je klase Graphics koji se predaje metodi paint()

Parametar metode setColor() je neka od standardnih boja koje su dane kao varijable klase u klasi Color (kao

red, green i druge iz tablice) ili instanca klase Color.

Npr. g.setColor(Color.pink); // korištenjem standardnih varijabli klase Color.

ili Color boja = new Color(255, 204, 102); // kreiran objekt klase Color u paketu java.awt

g.setColor(boja);

Nakon što je postavljena tekuća boja, sve operacije pisanja i crtanja odvijati će se u toj boji, sve dok se ne

postavi neku drugu boju.

Boju pozadine i komponenti u prozoru apleta postavlja se pomoću metoda setBackground() i

setForeground(). Apleti nasljeđuju te metode od klase Applet. Argument ovih metoda je objekt klase Color

ili standardne varijable klase Color.

setBackground(Color.white); // postavlja Boju pozadine

setForegroud(Color.pink) //mijenja boju komponenti sučelja, kao što su dugmad, itd.

Zadatak. Napiši aplet koji crta kvadrate koji su ispunjeni različitim bojama, izbočeni su. Kvadrati se smanjuju za jednu točku.

import java.awt.*;

public class Applet1 extends java.applet.Applet {

public void paint(Graphics g) {

for(int i=200; i>=30; i-=1){

Color boja = new Color(i, i*2, i+100);

g.setColor(boja);

g.fill3DRect(100-i/2,100-i/2, 60+i, 60+i,true);

}

}

}

Page 17: Java Aplet

Marina Ivašić, Java 17

Zadatak. Napiši aplet koji crta pet isječaka jedan do drugoga koji su popunjeni različitim bojama. Svaki isječak je u kvadratu

širine i visine 150 i počinje na 45 stupnju trigonometrijske kružnica i iznosi 45 stupnjeva.

import java.awt.*;

public class Applet1 extends java.applet.Applet {

public void paint(Graphics g) {

for(int i=0; i<=200; i+=50){

Color b = new Color(i*3,i*2,i*3);

g.setColor(b);

g.fillArc(50+i,50, 150, 150,45,45);

}

}

}

Slike

Osnovne operacije za rad sa slikama (GIF i JPEG formata) sadrži klasa Images koja je dio paketa

java.awt. Učitavanje i prikazivanje slika u apletu, omogućuju metode iz klasa Applet i Graphics.

getImage() //za prikaz sliku u apletu, treba učitati sliku sa getImage() koji stvara instancu klase Image

Da bismo mogli prikazati nekou sliku u apletu, najprije je treba učitati u naš program. Slike su pohranjene u

zasebne datoteke, odvojeno od Java klasa, tako da sustavu Java treba dati adresu na kojoj se te slike nalaze.

Web adresa stranice kojoj se pristupa predstavlja se kao objekt klase URL (Uniform Resource Locator) koja

je dio paketa java.net, tako da (poput klase Imege) treba biti importirana u aplet. Objekt klase URL kreira se

tako, da se adresa neke Web stranice da URL konstruktoru. Npr.

URL u = new URL("http://www.prefect.com/java21/images/book.gif");

Pristup slici može biti:

- sa apsolutne adrese: getImage(URL url_adresa) // donosi sliku koja se nalazi na toj URL adresi

Page 18: Java Aplet

Marina Ivašić, Java 18

Npr. URL u = new URL("http://www.pefri.hr/images/fax.gif"); // URL konstruktor

Image slika = getImage(u);

ili Image slika = getImage(new URL("http://www.pefri.hr/images/fax.gif"));

- sa relativne adrese u odnosu na neki URL ili direktorij: getImage(URL url_adresa, relativni_put)

Npr. Image slika = getImage(getCodeBase(), "slika.gif");

// metoda getCodeBase() vraća ime direktorija u kojem se aplet nalazi

ili Image slika = getImage(getDocumentBase(), "slika.gif");

// metoda getDocumentBase() vraća URL dokumenta u koji je aplet

ugrađen, slika se učitava iz istog direkorija u kojem je i Web stranica

U suštini, drugi način dijeli adresu slike na adresu direktorija na kojem se slika nalazi, i na ime datoteke (u tom

direktoriju) koja sadrži sliku. Drugi način je pogodniji, jer slika se obično nalazi na istom direktoriju na kojem se

nalazi Web stranica; a ta metoda uzima iz adrese Web stranice ime direktorija na kojem se nalazi slika, i to

pomoću dviju metoda klsae Applet: getDocumentBase(), i getCodeBase().

Prikazivanje slika

Nakon što smo sliku učitali u objekt klase Image, možemo ju prikazati u apletu pomoću metode drawImage()

koja spada u klasu Graphics.

Da bismo sliku prikazali u njenoj stvarnoj veličini, pozivamo metodu drawImage() sa slijedeća četiri argumenta:

- objekt klase Image koji treba prikazati;

- koordinate x i y lijevog gornjeg kuta slike

- ključna riječ "this".

drawImage(Image slika, x, y, this) // prikazuje sliku (objekt klase Image) u nekom apletu na

koordinatama x,y gornjeg lijevog kuta u stvarnoj veličini (ključna riječ this); spada u klasu Graphics.

Primjer.

public void paint (Graphics g) {

g.drawImage(slika, 10, 10, this);

}

Veličinu prikaza slike se može mijenjati korištenjem metode drawImage() sa šest argumenata:

- objekt klase Image koji treba prikazati;

- koordinate x i y;

- širina slike i visina slike;

- ključna riječ "this".

Argumenti "širina" i "visina" određuju širinu i visinu prostora (u točkicama) unutar kojeg treba biti prikazana

slika. Dana slika biti će prilagođena (raztegnuta, sužena) u skladu sa zadanim granicama prostora u kojem treba

biti prikazana. Naravno, izmijenjeni prikaz slike ne izaziva promjenu samoga zapisa slike (u datoteci), tako da

ista slika može biti prikazana na istoj stranici/ekranu u različitim veličinama.

drawImage(Image slika, x, y, s, v, this) // prikazuje sliku (objekt klase Image) u nekom apletu na

koordinatama x,y gornjeg lijevog kuta rastegnutu u pravokutniku veličine s * r .

Page 19: Java Aplet

Marina Ivašić, Java 19

Klasa Image sadrži metode getHeight() i getWidth koje daju visinu odnosno širinu nekog konkretnog prikaza

slike; te metode mogu biti korisne u situacijama kad slika nije prikazana u njenim stvarnim dimenzijama, već je

umanjena ili uvećana.

metode getHeight() i getWidth() klase Image daju trenutnu visinu odnosno širinu slike:

sirina = slika.getWith(this);

visina = getHeight(this);

Npr. import java.awt.Graphics;

import java.awt.Image;

import java.awt.Color;

public class Slike extends java.applet.Applet {

Image slika;

public void init() {

slika = getImage(getCodeBase(), "slika.jpg");

}

public void paint(Graphics g) {

int sirina = slika.getWidth(this);

int visina = slika.getHeight(this);

setBackground(Color.black);

g.drawImage(slika, 10, 10, this); //100%

g.drawImage(slika, 10, 100, sirina/2, visina/ 2, this); //50%

}

}

Animacija

Animaciju - privid pokreta, prikazivanjem slike za slikom na ekranu, izvodi se pomoću klasa iz paketa

java.awt.

Da bismo postigli animaciju slika, crteža, itd. izmjenjujemo slike ili sadržaj u prozoru apleta, tako da

"nacrtamo" (tj. definiramo, izračunamo, ili preuzmemo iz neke datoteke) novi sadržaj i zatim pozovemo

metodu repaint() koja će obnoviti sadržaj ekrana. Takav postupak možemo izvesti proizvoljno mnogo puta.

Kod animacije i apleta koji se ne izvode samo jednom (tj. samo prilikom "otvaranja" Web stranice) već rade

trajno, potrebno je koristiti metode start() i stop(). Metoda start() pokreće aplet, a metoda stop() prekida

njegov rad, kada korisnik napusti stranicu koja sadrži taj aplet.

Za zadatke koji se odvijaju kontinuirano i iziskuju dosta procesnog vremena (a takve su i ciklički ponavljane

operacije crtanja ("repainting") pomoću kojih se stvara animirana slika) prikladno je korištenje niti (thread).

Izdvajanjem zadatka koji izvodi animaciju u jednu zasebnu nit programa, oslobađa se ostatak programa koji

se onda može baviti drugim stvarima. To se naziva i multitasking (tj. obavljanje više zadataka odjednom), jer

takav program (kao cjelina) izvršava više od jednog zadatka/posla istodobno. Primjena niti ujedno olakšava

rad sustava na kojem se aplet izvodi jer se jedan procesno intenzivan i kontinuiran zadatak izdvaja kao

posebna cjelina (nit).

Da bi se u apletu koristila nit, potrebno je:

1) Stvoriti klasu koja implementira sučelje Runnable / nasljeđuje klasu Thread.

2) Napraviti instancu klase Thread koji sadrži animiranu nit.

3) Nadjačati metodu start() da bi se stvorila i pokrenula nit animacije (pokreće metodu run u niti).

1) Nadjačati metodu run() koja sadrži naredbe koje čine nit i u kojoj počinje njeno izvršavanje

2) Stvoriti metodu repaint() koja će pozvati metodu update() radi obnavljanja sadržaja ekrana

3) Stvoriti metodu update() koja briše sadržaj ekrana (ispunjava ga bojom pozadine) i zatim poziva

metodu paint()

Page 20: Java Aplet

Marina Ivašić, Java 20

4) Nadjačati metodu paint() koja crta sadržaj ekrana, stvara novu sličicu

5) Nadjačati metodu stop() da bi se zaustavila nit animacije (postavila u stanje null).

Runnable je sučelje. Pomoću sučelja klasa "pribavlja" svojstva (metode, ponašanja) koja ne može naslijediti od

svojih nadklasa. Sučelje Runnable deklarira metodu run(), koja se poziva za pokretanje niti.

Klasa Thread je dio standardnog paketa java.lang, tako da se nju ne mora eksplicitno učiniti dostupnom

pomoću naredbe import. Objekt klase Thread može biti kreiran u apletovoj metodi start(). Provjerava se da

li je nit (instanca klase Threas) već stvorena (vrijednost instance različita od null); ako nije, onda se stvara.

Primjer:

Thread animacija;

public void start() {

if (animacija == null) {

animacija = new Thread(this);

animacija.start();

}

}

Ključna riječ "this" koja je upotrebljena u konstruktoru Thread() je način da se referira na objekt u kojem se

ta metoda odvija, u našem primjeru, na sam aplet.

Nit se pokreće sa metodom start().

animacija.start();

Pokrenuta nit poziva metodu run() koja je definirana u implementiranom sučelju Runnable. Metoda run()

definira način rada niti i upravlja nitima, tj. animacijom (postavlja sadržaj na ekran i briše ga).

Nit se zaustavlja u metodi stop() tako da se postavi na null (animacija = null). To neće, samo po sebi,

zaustaviti nit; međutim, metodu run() možemo oblikovati tako, da se izvodi samo dok objekt klase Thread

nije jednak null.

Dodavanjem naredbe implements Runnable, kreiranjem objekta klase Thread koji je povezan sa apletom, te

korištenjem apletovih metoda start(), stop(), i run(), aplet postaje višenitni program.

Zadatak. Napiši animaciju koja crta vlak koji se kreće. // pojednostavljena verzija

import java.awt.*;

import java.applet.*;

public class Applet1 extends Applet implements Runnable {

Thread animacija;

int i;

public void start() {

animacija = new Thread(this);

animacija.start();

}

public void stop() {

animacija = null;

}

Page 21: Java Aplet

Marina Ivašić, Java 21

public void run() {

while (true) {

for ( i =1; i<getSize().width; i +=10){

repaint();

try {

Thread.sleep(500);

} catch (InterruptedException e) { }

}

}

}

public void paint(Graphics g) {

if (i==1) g.clearRect(0,0,getSize().width,getSize().height);

g.setColor(Color.blue);

g.fill3DRect(10+i,10,60,30,true);

g.setColor(Color.black);

g.fillOval(15+i,40,15,15);

g.fillOval(50+i,40,15,15);

}

}

Npr. Animacija koja pokazuje datum i vrijeme

import java.awt.Graphics;

import java.awt.Font;

import java.util.Date;

public class AnimirSat extends java.applet.Applet implements Runnable {

Font pismo = new Font("Arial",Font.BOLD,36); //objekt fonta

Date datum; // objekt datuma

Thread animacija; // objekt niti za animaciju

public void start() {

if (animacija = = null) { // ako nije stvorena programska nit

animacija = new Thread(this); //stvori nit animacija

animacija.start(); //pokreni nit animaciju i pozovi run()

}

}

public void stop() {

if (animacija != null) { // ako je nit bila pokrenuta

animacija = null; // postavi vrijednost instance animacije na null kako

} // bi se moglo upravljati zaustavljanjem

Page 22: Java Aplet

Marina Ivašić, Java 22

}

public void run() {

while (animacija = = Thread.currentThread()) {

datum = new Date(); // stvara instancu klase Date sa tekućim datumom

repaint(); // poziva metodu paint i obnavlja sadržaj ekrana

try {

Thread.sleep(1000); // zaustavlja nit na 1 sekundu

} catch (InterruptedException e) { }

}

}

public void paint(Graphics g) {

g.setFont(pismo); //postavlja se definiran font

g.drawString(datum.toString(), 50, 50); // ispis novog vremena

} // koristi se toString() na objektu datum da bi se vrijeme prikazalo kao niz znakova

}

Smanjnje treperenje animacije

Tijekom animacije primjećuje se podrhtavanje koje je uzrokovano načinom na koji java obnavlja ispis u prozoru

apleta. Prilikokm poziva metode repaint(), ona dalje poziva metodu update() koja briše ekran (tj. prozor apleta) i

ispunjava ga bojom pozadine. Metoda update() zatim poziva metodu paint() koja izvodi ispis novog sadržaja u

prozoru apleta.

Metoda update() je glavni krivac za podrhtavanje slike jer ona čini da se nanovo ispisuju i oni djelovi prozora

koji se ne mijenjaju; a upravo ti dijelovi najviše podrhtavaju prilikom prelaska iz stanja "izbrisanosti" u stanje

"ponovnog (jednakog) ispisa".

Jedan od načina da se izbjegne podrhtavanje ispisa apleta je da se nadjača metodu update() tako da ona ili ne vrši

brisanje, ili pak briše samo one djelove prozora apleta koji se odista mijenjaju.

Originalna metoda update():

Metoda update() je u svakom apletu (po defaultu), slijedećeg oblika:

public void update(Graphics g) {

g.setColor(getBackground());

g.fillRect(0, 0, width, height);

g.setColor(getForeground());

paint(g);

}

Kako nadjačati metodu update()

Page 23: Java Aplet

Marina Ivašić, Java 23

Podrhtavanje uzrokovano pozivanjem metode update() može se umanjiti nadjačavanjem metode update():

- tako da uopće ne briše ekran

public void update(Graphics g) { //nadjačana metoda update() tako da umjesto da

paint(g); //prekriva prozor bojom pozadine poziva metodu paint()

}

- da briše samo one djelove prozora apleta koji su se promijenili;

public void update(Graphics g) { //nadjačana metoda update() tako da bojom pozadine

g.clipRect(x,y,sirina, visina) // popuni samo pravokutnik koji označava prostor

// budućih grafičkih operacija definiram sa clipRect()

paint(g); // metoda paint() osvježiti će samo označeni pravokutnik

}

Primjer isključivanja brisanja ekrana (u slučajevima kada su objekti na sličicama na jednakim

koordinatama, tj. kada se mijenja stanje istim pikselima).

//ispisuje tekst i mijenja mu boju

import java.awt.Graphics;

import java.awt.Color;

import java.awt.Font;

public class Animirtekst extends java.applet.Applet implements Runnable {

Font f = new Font("TimesRoman", Font.BOLD + Font.ITALIC, 48);

Color boje[] = new Color[100]; //polje boja je instanca klase Colors

Thread animacija;

public void init() {

for (int i = 0; i < boje.length; i++)

boje[i] = new Color(i*2, i/2, 150); //upisivanje boja u polje boja

}

public void start() {

if (animacija = = null) {

animacija = new Thread(this);

animacija.start();

}

}

public void stop() {

if (animacija != null) {

animacija = null;

}

public void run() {

int i = 0;

while (animacija = = Thread.currentThread()) {

setForeground(boje[i]);

repaint();

i++;

try {

Thread.sleep(200);

} catch (InterruptedException e) { }

if (i == boje.length ) i = 0;

}

}

public void update(Graphics g) { //nadjačana metoda update() tako da umjesto da

paint(g); //prekriva prozor bojom pozadine poziva metodu paint()

}

Page 24: Java Aplet

Marina Ivašić, Java 24

public void paint(Graphics g) {

g.setFont(f);

g.drawString("Mijenjam boje", 100, 50);

}

}

Double Buffering

Drugi način da se smanji treptanje animacije je korištenje dvostrukog buffiranja.

Osnovni princip je da se najveći dio grafike napravi offscreen, pa da se naknadno sa jednim pozivom

drawImage() prikaže okvir na ekranu. Jedini nedostatak je da se treba alocirati offscreen slika koja je

velika kao i područje crtanja, što (ako je područje crtanja veliko), zahtjeva puno memorije.

Kada se koristi dvostruki buffring potrebno je nadjačati metodu update()kako se pozadina apleta ne bi

izbrisala prije prikaza okvira.

Animacija sa slikama

Prije nego pisanja Java apleta koji će animirati sliku, sve slike koje tvore danu animaciju trebaju biti

pohranjene u direktoriju u koji će se spremiti Web stranica. Odabrane slike smješta se u polje/vektor

objekata klase Image, a trenutnu sliku koju treba prikazati u objekt klase Image.

Primjer:

//10 sličica iz poddirektorija Slike (slika_1.gif, slika_2.gif,… slika_10.gif) iscrtava se na ekranu

import java.awt.Graphics;

import java.awt.Image;

import java.awt.Color;

public class AnimirSlike extends java.applet.Applet implements Runnable {

Image slike[] = new Image[10];

Image trenSlika;

Thread animacija;

public void init() {

for (int i=1; i <=slike.length; i++) { //učitavanje slika u polje

slike[i-1] = getImage(getCodeBase(), "Slike/slika_" + i + ".gif");

}

}

public void start() {

animacija = new Thread(this);

animacija.start();

}

public void stop() {

animacija = null;

Page 25: Java Aplet

Marina Ivašić, Java 25

}

public void run() {

setBackground(Color.white);

int i = 0;

while (true) {

trenSlika = slike[i]; //uzmi slijedeću sliku

repaint(); //prikaži slijedeću sliku

i++;

if (i = = slike.length) i=0;

pause(150);

}

}

void pause(int vrijeme) {

try {

Thread.sleep(vrijeme);

} catch (InterruptedException e) { }

}

public void paint(Graphics g) {

if (trenSlika!= null)

g.drawImage(trenSlika, 15, 15, this);

}

}

Page 26: Java Aplet

Marina Ivašić, Java 26

Događaji i interaktivnost

Događaj (event) se inicira iznenada u određenom vremenu, nema trajanje i uzrokuje pozivanje jedne ili

više metoda (action) koje ga obrađuju i utjeću na promjenu stajna (automatski kao pozivanje metode

paint ili kreiranjem odgovarajućih metoda za npr. pomicanje i pritiskanje tipki miša ili tipkovnice)

Svaki događaj generira instancu klase Event, koja sadrži informacije gdje i kada se događaj dogodio,

koje je vrste taj događaj, koje komponente su ga uzrokovale,…

Da bi se određeni događaj obradio u apletu na odgovarajući način, potrebno je nadjačati pripadajuću

metoda za rukovanje događajima koja će kada se događaj aktivira biti pozvana. U izvornom kodu treba

uključiti klase paketa java.awt.event: import java.awt.event. *

Vrste događaja:

1. Događaji vezani za rad sa mišem

2. Događaji vezani za rad sa tipkovnicom

3. Događaji na korisničkom sučelju ( botun, lista, polje, okviri, dijalozi, pomične trake, prozori, …)

Događaji vezani za rad sa mišem (Mouse Events)

Svaki put kada se dogodi neki događaj sa mišom biti će pozvana odgovarajuća metoda koju je potrebno

u apletu nadjačati:

API 1.0

1. mouseDown(Event ev, int x, int y) - pritisak lijeve tipke miša

2. mouseUp(Event ev, int x, int y) - otpuštanje lijeve tipke miša

3. mouseMove(Event ev, int x, int y) - pomicanje miša

4. mouseDrag(Event ev, int x, int y) - pomicanje miša uz pritisnutu lijevu tipku

5. mouseEnter (Event ev, int x, int y) - pokazivač miša pristupa području koje pripada apletu

6. mouseExit (Event ev, int x, int y) - pokazivač miša izašao iz području koje pripada apletu

Primjer sintakse:.

public boolean mouseDown(Event e, int x, int y) { //e je instanca klase Event,

... // x i y su kooordinate točke na kojoj se zbio događaj

}

Pr.1. // crta točku na mijestu gdje se klikne mišem

import java.awt.*;

import java.applet.*;

public class Tocka extends Applet {

final int max = 50;

int x[] = new int[max];

int y[] = new int[max];

int br = 0;

public void init(){

setBackground(Color.green); // boja pozadine postavlja samo jednom.

}

public boolean mouseDown (Event e, int xk, int yk){

if (br < max)

novaTocka(xk,yk);

Page 27: Java Aplet

Marina Ivašić, Java 27

else

br=1;

this.showStatus("Ukupno je nacrtano " + br + " tocaka");

return true; // određuje da je događaj obrađen

}

void novaTocka(int xk, int yk) {

x[br] = xk;

y[br] = yk;

br++;

repaint();

}

public void update(Graphics g) {

paint(g);

}

public void paint(Graphics g){

if (br%2==0)

g.setColor(Color.red);

else

g.setColor(Color.yellow);

for (int i=0; i<br; g.fillOval(x[i],y[i++],25,25 )); //ponovno iscrtavanje svih točak na ekranu

}

}

API 1.1

1. mousePressed(MouseEvent ev) - pritisak lijeve tipke miša

2. mouseReleased(MouseEvent ev) - otpuštanje lijeve tipke miša

3. mouseMoved(MouseEvent ev) - pomicanje miša

4. mouseDragged(MouseEvent ev) - pomicanje miša uz pritisnutu lijevu tipku

5. mouseEntered (MouseEvent ev) - pokazivač miša pristupa području koje pripada apletu

6. mouseExited (MouseEvent ev) - pokazivač miša izašao iz području koje pripada apletu

7. mouseClicked(MouseEvent ev) - klikanje miša bez pomaka

Primjer sintakse:

public boolean mousePressed(MouseEvent e) {

...

}

Metoda vraća vrijednost tipa boolean:

true - metoda na određenom elementu korisničkog sučelja je obradila događaj

false - metoda ne može obraditi događaj, prosljeđuje ga komponentama više razine

Potrebno je implementirati MouseListener, MouseMotionListener kako bi se nadjačale metode u

kojima se uključuju metode za rad sa događajima sa mišem:

addMouseListener( this );

addMouseMotionListener( this );

Pr.2. sa API 1.1

import java.awt.*;

Page 28: Java Aplet

Marina Ivašić, Java 28

import java.applet.*;

import java.awt.event.*;

public class m3 extends Applet implements MouseListener {

int xpos;

int ypos;

int prav_x,prav_y,prav_s,prav_v;

boolean mouseEntered;

boolean pravKlik;

public void init() {

prav_x = 20;

prav_y = 20;

prav_s = 100;

prav_v = 50;

addMouseListener(this);

}

public void paint(Graphics g) {

g.setColor(Color.RED);

g.fillRect(prav_x,prav_y,prav_s,prav_v);

g.setColor(Color.BLUE);

g.drawString("("+xpos+","+ypos+")",xpos,ypos);

// klik u pravokutniku

if (pravKlik)

g.drawString("Klik u pravokutniku",20,120);

// izvan

else g.drawString("Klik izvan pravokutnika",20,120);

if (mouseEntered)

g.drawString("Miš je u području apleta",20,160);

else

g.drawString("Miš je izvan područja apleta",20,160);

}

// Metoda se poziva kada je kliknuta tipka miša.

public void mouseClicked (MouseEvent me) {

xpos = me.getX(); // pozicija gdje je kliknuto

ypos = me.getY();

// U pravokutnika:

if (xpos > prav_x && xpos < prav_x+prav_s && ypos >prav_y && ypos <

prav_y+prav_y)

pravKlik = true;

// izvan pravokutnika

else

pravKlik = false;

//prikaz rezultata

repaint();

}

// Miš je ušao u područje apleta

public void mouseEntered (MouseEvent me) {

mouseEntered = true;

repaint();

}

// Miš je izašao iz područja apleta

public void mouseExited (MouseEvent me) {

mouseEntered = false;

repaint();

}

@Override

public void mousePressed(MouseEvent arg0) {

}

@Override

public void mouseReleased(MouseEvent arg0) {

Page 29: Java Aplet

Marina Ivašić, Java 29

}

}

Pr. 4 sa API 1.1

import java.applet.Applet;

import java.awt.*;

import java.awt.event.*;

public class m2 extends Applet

implements MouseListener, MouseMotionListener {

int mx, my; // koordinate miša

int visina, sirina; //područja apleta

boolean isMousePressed = false;

public void init() {

setBackground(Color.black);

mx = getSize().width/2;

my = getSize().height/2;

addMouseListener( this );

addMouseMotionListener( this );

}

public void mousePressed( MouseEvent e ) {

isMousePressed = true;

setBackground( Color.ORANGE );

showStatus( "Clicked1...Miš je na koordinatama (" + mx + "," + my + ")" );

repaint();

}

public void mouseReleased( MouseEvent e ) {

isMousePressed = false;

setBackground( Color.black );

showStatus( "Clicked2...Miš je na koordinatama (" + mx + "," + my + ")" );

repaint();

}

public void mouseMoved( MouseEvent e ) {

mx = e.getX();

my = e.getY();

showStatus( "Moved...Miš je na koordinatama (" + mx + "," + my + ")" );

repaint();

}

public void mouseDragged( MouseEvent e ) {

mx = e.getX();

my = e.getY();

showStatus( "Dragged...Miš je na koordinatama (" + mx + "," + my + ")" );

repaint();

}

public void paint( Graphics g ) {

if ( isMousePressed ) {

g.setColor( Color.GREEN );

}

else {

g.setColor( Color.BLUE );

}

g.fillRect( mx-20, my-20, 40, 40 );

}

@Override

public void mouseClicked(MouseEvent e) {

}

Page 30: Java Aplet

Marina Ivašić, Java 30

@Override

public void mouseEntered(MouseEvent e) {

}

@Override

public void mouseExited(MouseEvent e) {

}

}

Pr. 3. // sa back bufferingom

import java.applet.*;

import java.awt.*;

import java.awt.event.*;

public class Crtanje extends Applet implements MouseMotionListener {

int sirina, visina;

Image backbuffer;

Graphics backg;

public void init() {

sirina = getSize().width;

visina = getSize().height;

backbuffer = createImage(sirina, visina);

backg = backbuffer.getGraphics();

backg.setColor( Color.black );

backg.fillRect( 0, 0, sirina, visina);

backg.setColor( Color.white );

addMouseMotionListener( this );

}

public void mouseMoved( MouseEvent e ) { }

public void mouseDragged( MouseEvent e ) {

int x = e.getX();

int y = e.getY();

backg.fillOval(x-5,y-5,10,10);

repaint();

e.consume();

}

public void update( Graphics g ) {

g.drawImage( backbuffer, 0, 0, this );

}

public void paint( Graphics g ) {

update( g );

}

}

Page 31: Java Aplet

Marina Ivašić, Java 31

Obrada događaja sa tipkovnice (Keyboard events)

Svaki pritisak na tipku pokrene događaj keyDown.

Sintaksa: keyDown(Event e, int tipka);

Primjer:

import java.awt.*;

import java.applet.*;

public class Tipka extends Applet {

public void init(){

setBackground(Color.blue); // boja pozadine postavlja samo jednom.

}

public boolean keyDown(Event e, int tipka) {

char c = (char) tipka; //ASCII kod znaka potrebno je pretvoriti u znakovni tip

this.showStatus("Pritisnuta je tipka: " + c+ ", njen ASCII je " + tipka );

return true;

}

}

Ili

Implementiranje sučelja KeyListener i nadjačavanje metoda:

public void keyTyped( KeyEvent e ) {

}

public void keyPressed(KeyEvent e) {

}

public void keyReleased(KeyEvent e) {

}

Pr.2

import java.applet.Applet;

import java.awt.*;

public class t1 extends Applet implements KeyListener{

int x, y;

String s = "";

public void init() {

setBackground( Color.black );

x = 20;

y = 20;

addKeyListener( this );

}

public void keyTyped( KeyEvent e ) {

char c = e.getKeyChar();

if ( c != KeyEvent.CHAR_UNDEFINED ) {

s = s + c;

repaint();

}

Page 32: Java Aplet

Marina Ivašić, Java 32

}

public void paint( Graphics g ) {

g.setColor( Color.gray );

g.setColor( Color.green );

g.drawString( s, x, y );

}

@Override

public void keyPressed(KeyEvent arg0) {

}

@Override

public void keyReleased(KeyEvent arg0) {

}

}

Pr. 2 a // poboljšana verzija sa definiranjem pozicije pisanja (događajima vezanim za miša)

import java.applet.*;

import java.awt.*;

public class t2 extends Applet implements KeyListener, MouseListener {

int x, y;

String s = "";

public void init() {

setBackground( Color.black );

x = 20;

y = 20;

addKeyListener( this );

addMouseListener( this );

}

public void keyTyped( KeyEvent e ) {

char c = e.getKeyChar();

if ( c != KeyEvent.CHAR_UNDEFINED ) {

s = s + c;

repaint();

e.consume();

}

}

public void mouseClicked( MouseEvent e ) {

x = e.getX();

y = e.getY();

s = "";

repaint();

e.consume();

}

public void paint( Graphics g ) {

g.setColor( Color.gray );

g.drawLine( x, y, x, y-10 );

g.drawLine( x, y, x+10, y );

g.setColor( Color.green );

g.drawString( s, x, y );

}

}

Page 33: Java Aplet

Marina Ivašić, Java 33

Korisničko sučelje

Osnova izrade korisničkog sučelja je postavljanje objekata na ekran (objektom se smatra sve: od prozora,

platna, do najmanjih komponenti koje su na njemu sadržane), i praćenje događaja koji se nad njima odvijaju.

Osnovni dijelovi AWT-a:

1. Komponente - elementi na grafičkom sučelju:

1.1. labele (Label)

1.2. botuni (Button)

1.3. kvadratići izbora (Checkbox)

1.4. radio-gumbi (radio-button iz klase Checkbox-a)

1.5. tekstualna polja (TextField)

1.6. tekstualni prostor (TextArea)

1.7. padajuće liste (Choice)

1.8. pomične liste (scrolling liste - u klasi List)

2. Kontejneri (containers) - komponente koje mogu sadržavati druge komponente

2.1. platna (canvas) - dio ekrana na kojem se mogu obavljati grafičke operacije

3. Komponente prozora - komponente za stvaranje prozora, okvira za dijalog, menija, podmenija,..

3.1. pomične trake (Scrollbar)

3.2. brzi izbornici (PopupMenu)

3.3. naredbe na meniu (MenuItem)

Klase za izradu sučelja dio su Abstract Window Toolkit-a (AWT) i nalaze se u paketu java.awt. Sve

komponente nasljeđuju svoja svojstva od klase Component u kojoj su deklarirane metode vezane za

izgled komponenti i praćenje događaja nad njima.

Rad sa komponentama:

1. deklarirati (stvoriti) komponentu

2. pomoću metode add() dodati komponentu u odgovarajući kontejner radi prikaza na ekran

3. korištenje metoda kojima se može njome upravljati

Labele (Label) - koristi se za ispis teksta na ekranu

- stvorena labela je instance klase Label:

Label nazivLabele = new Label(string, poravnanje);

gdje je: string - tekst koji treba ispisati

poravnanje - poravnanje labele {Label.CENTAR | Label.LEFT | Label.RIGHT}

- prikazivanje labele na ekranu:

add(nazivLabele);

- metode:

Deklaracija Namjena

int getAlignment() vraća trenutno poravnanje labele

String getText() vraća trenutni tekst labele

void setAlignment(int poravnanje) poravnava labelu na jednu od konstanti poravnanja

void setText(String tekst) postavlja novi tekst labele

Primjer:

import java.awt.*;

public class Labele extends java.applet.Applet {

public void init() {

add(new Label("U jednoj naredbi stvorena je instanca i prikazana na

ekranu", Label.LEFT));

Label drugaLabela = new Label("tekst ");

add(drugaLabela); drugaLabela.setText("promjena teksta");

} }

Page 34: Java Aplet

Marina Ivašić, Java 34

Botuni (Button) - klikom na njih pokreću se određene akcije

- stvoren botun je instance klase Botton

Button nazivBotuna = new Button (labela_botuna);

ili

Button nazivBotuna = new Button ();

nazivBotuna .setLabel(labela_botuna); //setLabel postavlja novi tekst na botunu

gdje je: labela_botuna - tekst koji se ispisuje na botunu

- prikazivanje botuna na ekranu:

add(nazivBotuna);

- metode:

Deklaracija Namjena

String getLabel() vraća trenutni tekst botuna

void setLabel(String tekst) postavlja novi tekst na botunu

Primjer: import java.awt.*;

public class Botuni extends java.applet.Applet {

public void init() {

Button b1 = new Button ("Prvi");

Button b2 = new Button ("Drugi");

add(b1);

add(b2);

}

}

Kvadratići izbora (Checkbox) - omogućavaju odabir više mogućnosti od jednom

- stvorenanje instance klase Checkbox

Checkbox nazivKvad = new Checkbox (labela, grupa, stanje);

gdje je: labela - tekst koji se ispisuje pored kvadratića

grupa - grupa kojoj kvadratić pripada, odnosno null ako ne pripada nikakvoj grupi

stanje - true - ako je označen (aktiviran) / false ako je isključen

- prikazivanje kvadratića na ekranu:

add(nazivKvad);

- metode:

Deklaracija Namjena

String getLabel() vraća trenutni tekst kvadratica

void setLabel(String tekst) postavlja novi tekst kvadratica

boolean getState() vraća stanje kvadratića

void setState(boolean stanje) postavlja stanje kvadratića na true ili false

Primjer: import java.awt.*;

public class Kvadratici extends java.applet.Applet {

public void init() {

Checkbox k1 = new Checkbox ("Matematika", null, true);

Checkbox k2 = new Checkbox ("Informatika", null, false);

Checkbox k3 = new Checkbox ("Fizika", null, true);

add(k1);

add(k2);

add(k3);

}

}

Page 35: Java Aplet

Marina Ivašić, Java 35

Radio-gumbi (Checkbox) - omogućavaju odabir samo jedne od ponuđenih mogućnosti

- stvorenanje instance klase Checkbox

CheckboxGroup grupa = new CheckboxGroup ();

Checkbox nazivKvad = new Checkbox (labela, grupa, stanje);

gdje je: labela - tekst koji se ispisuje pored kvadratića

grupa - grupa kojoj kvadratić pripada

stanje - true - ako je označen (aktiviran) / false ako je isključen

- prikazivanje radio-botuna na ekranu:

add(nazivKvad);

- metode:

Deklaracija Namjena

CheckboxGroup CheckboxGroup () vraća grupu kojoj pripada kvadratic/ radio-botun

void setCheckboxGroup (CheckboxGroup gr1) postavlja kvadratica u grupu gr1

Primjer: import java.awt.*;

public class Tekst_polje extends java.applet.Applet {

public void init() {

CheckboxGroup predmeti = new CheckboxGroup ();

add( new Checkbox ("Matematika", predmeti, true));

add( new Checkbox ("Informatika", predmeti, false));

add( new Checkbox ("Fizika", predmeti, false));

}

}

Tekstualna polja (TextField) - okvir unutar kojeg korisnik može upisati poruku unutar jednog retka

- stvorenanje instance klase TextField

TextField tekst = new TextField(string, sirina);

gdje je: string - tekst koji treba biti prikazan u polju prije nego korisnik započne unos

širina - broj znakova koji se u polje mogu upisati

- prikazivanje tekstualnog polja na ekranu:

add(tekst);

- metode:

Deklaracija Namjena

String getText() vraća tekst upisan u polje

void setText (String tekst) postavlja novi tekst u polje

int getColumns() vraća širinu polja za upis teksta

void select(int poz1, int poz2) selektira tekst između pozicija poz1 i poz2

void selectAll() selektira citav tekst u polju

boolean isEditable() true ako se može mijenjati sadržaj polja, inače false

void setEditable(boolean upis) određuje može li korisnik mijenjati sadržaj polja

void setEchoCharacter(char znak) postavlja znak koji se ispisuje umjesto upisanih znakova

Primjer: import java.awt.*;

public class Tekst extends java.applet.Applet {

public void init() {

Label ime = new Label("Upiši svoje ime");

Label prezime = new Label("Upiši svoje prezime");

Label lozinka = new Label("Upiši svoju lozinku");

TextField p_ime = new TextField("Ime ", 20);

TextField p_prezime = new TextField("Prezime ", 30);

TextField p_lozinka = new TextField(20);

p_lozinka.setEchoCharacter('*'); //lozinka se ne prikazuje

add(ime); add(p_ime); add(prezime); add(p_prezime);

add(lozinka); add(p_lozinka);

}

}

Page 36: Java Aplet

Marina Ivašić, Java 36

Tekstualni prostor (TextArea) - omogućavaju upis duljih tekstova

- stvorenanje instance klase TextArea

TextArea tekstPodrucje = new TextArea (tekst, redci, znakovi);

gdje je: tekst - tekst koji treba biti prikazan u polju prije nego korisnik započne unos

redci - broj redaka u polju

znakovi - broj znakova u pojedinom redku

- prikazivanje tekstualnog prostora na ekranu:

add(tekstPodrucje);

- metode:

Deklaracija Namjena

void appendText(String noviTekst) dodaje noviTekst na kraju prikazanog teksta

int getColumns() vraća broj znakova trenutnog tekstualnog područja

int getRows() vraća broj redaka trenutnog tekstualnog područja

void insertText(String tekst, int poz) ubacuje tekst u tekstualno područje na poziciji poz

void replaceText(String tekst, int poz1,

int poz2)

zamjenjuje postojeći tekst od pozicije poz1 do

poz2 novim tekstom

void selectAll() selektira citav tekst u polju

boolean isEditable() true ako se može mijenjati sadržaj polja, inače false

void setEditable(boolean upis) određuje može li korisnik mijenjati sadržaj polja

Primjer: import java.awt.*;

public class Tekst_podrucje extends java.applet.Applet {

public void init() {

String sadrzaj = "Java \n\n" +

"Osnova izrade korisničkog sučelja je postavljanje objekata na ekran\n

" +

"(objektom odnosno komponentom smatra se sve od prozora, platna, do

najmanjih \n komponenti koje su na njemu sadržane), i praćenje događaja koji

se nad njima odvijaju. ";

TextArea tekst = new TextArea(sadrzaj, 10, 80);

Font pismo = new Font("Tahoma", Font.PLAIN, 14);

setFont(pismo);

add(tekst);

}

}

Padajuće liste (Choice) - popis mogućnosti od kojih korisnik izabire jednu

- stvorenanje instance klase Choice

Choice izbor= new Choice ();

- dadavanje elemenata na listi:

izbor.addItem(labela);

- prikazivanje liste na ekranu:

add(izbor);

- metode:

Deklaracija Namjena

int countItems() vraća broj elemenata liste

String getItem(int pozicija) vraća tekst opcije na zadnoj poziciji

int getSelectedIndex() vraća poziciju trenutno odabranog elementa liste

String getSelectedItem() vraća tekst trenutno aktivnog elementa liste

Pomićne liste (List)- omogućuju odabir više opcija sa liste; elementima se može pristupiti pomoću

pomićne trake

- stvorenanje instance klase List

List lista= new List (broj,visestruki_odabir);

gdje je :

broj - broj elemenata koji su vidljivi na popisu

Page 37: Java Aplet

Marina Ivašić, Java 37

visestruki_odabir - true ako je moguće odabrati vise elemenata inaće false

- dadavanje elemenata na listi:

lista.addItem(labela);

- prikazivanje liste na ekranu:

add(lista);

- metode:

Deklaracija Namjena

synchronized void replaceItem(String

novi, int poz)

zamjenjuje element na navedenoj poziciji

synchronized void delItem(int poz) briše element na navedenoj poziciji

void select(int poz) selektira element na navedenoj poziciji

int countItems() vraća broj elemenata liste

String getItem(int pozicija) vraća tekst opcije na zadnoj poziciji

synchronized int[] getSelectedIndex() vraća pozicije trenutno odabranih elemenata liste

synchronized String[] getSelectedItem() vraća niz tekstova trenutno aktivnih elemenata liste

Primjer: import java.awt.*;

public class Liste extends java.applet.Applet {

public void init() {

List Gradovi = new List(3,true);

Gradovi.addItem("Rijeka");

Gradovi.add("Pula");

Gradovi.add("Split");

Gradovi.add("Zagreb");

add(Gradovi);

Choice Zupanije = new Choice();

Zupanije.add("Primorsko goranska");

Zupanije.add("Istarska");

Zupanije.add("Dalmatinska");

Zupanije.add("Zagrebačka");

add(Zupanije);

}

}

Metode koje utječu na izgled komponenti

Deklaracija Namjena

public Color getForeground() vraća boju prednjeg platna komponente

public synchronized void setForeground(Color c) postavlja boju prednjeg platna komponente

public Color getBackground() vraća boju pozadine komponente

public synchronized void setBackground(Color c) postavlja boju pozadine komponente

public Font getFont() vraća pismo kojim je ispisan naziv komponente

public synchronized void set Font (Font f) postavlja pismo za ispis teksta komponente

public void move(int x, int y) premješta komponentu na tocku (x,y)

public void reshape(int x, int y, int sir, int vis) postavlja komponentu na tocku (x,y) i određuje

njenu sirinu i visinu

public void resize(int sir, int vis) postavlja sirinu i visinu komponente

public void repaint() iscrtava komponentu na ekran

Primjer: import java.awt.*;

public class PomicniBotun extends java.applet.Applet {

Button bot = new Button("Klikni me");

public void int() {

add(bot);

}

public boolean mouseMove(Event e, int x, int y) {

bot.move(x-30,y-30); //pomiće botun kada se miš pomakne

Page 38: Java Aplet

Marina Ivašić, Java 38

bot.repaint();

return true;

}

}

Platna (Panel) - omogućavaju podjelu korisničkog sučelja i korištenje više načina rasporeda

komponenti

- stvorenanje instance klase Panel

Panel platno = new Panel ();

- dadavanje elemenata na platno:

platno.add(labela); //naziv botuna, kvadratića, radiobotuna, liste,…

- prikazivanje platna na ekranu:

add(platno);

Primjer: import java.awt.*;

public class PomicniBotun extends java.applet.Applet {

public void int() {

Panel platno1 = new Panel ();

add(platno1);

Panel platno2 = new Panel ();

add(platno2);

Button bot1 = new Button("Jedan");

Button bot2 = new Button("Dva");

Button bot3 = new Button("Tri");

Button bot4 = new Button("Cetiri");

platno1.add(bot1);

platno1.add(bot2);

platno2.add(bot3);

platno2.add(bot4);

}

}

Metode koje utjecu na raspored komponenti (Layout Manageri) - način razmještanja komponenata

po ekranu

Postupak:

1. definiranje instance jedne od klasa sa odgovarajućim parametrima:

- FlowLayout

- GridLayout

- GridBagLayout

- BorderLayout

- CardLayout

2. pozivanje metode setLayout(raspored);

Pr.

import java.applet.Applet;

import java.awt.*;

public class sucelje2 extends Applet {

public void init() {

Label l1,l2;

l1 = new Label("Kultura");

l2 = new Label("Sport");

Page 39: Java Aplet

Marina Ivašić, Java 39

Button b1 = new Button ("Film");

Button b2 = new Button ("Ski");

Button b3 = new Button ("Glazba");

Button b4 = new Button ("Odbojka");

Panel pozadina1 = new Panel();

pozadina1.setLayout(new GridLayout(3,2));

Font pismo = new Font("Tahoma", Font.CENTER_BASELINE+Font.BOLD, 14);

setFont(pismo);

pozadina1.add(l1);

pozadina1.add(l2);

pozadina1.add(b1);

pozadina1.add(b2);

pozadina1.add(b3);

pozadina1.add(b4);

add(pozadina1);

}

}

Metode za obradu događaja na komponentama sučelja

Događaji na komponentama sučelja su akcije (action) koje pokazuju da je komponenta aktivirana a

kontroliraju se metodom:

public boolean action( Event e, Object arg ) {

...

}

gdje je: e - instanca klase Event

arg - objekt koji može biti instanca bilo koje klase ovisno o komponenti sučelja koja je

pokrenula događaj (botun, lista, radio-botun,..) i koji sadrži sve informacije o

nastalom događaju

Upotrebom operatora instanceof potrebno je provjeriti na kojem tipu komponente se zbio događaj, te

usporedbom oznake točna komponenta:

Pr.

public boolean action(Event e, Object arg){

if (e.target instanceof Button){

if (arg=="Pravokutnik")

boja=1;

else if (arg=="Krug")

boja=2;

}

}

Primjer 1:// Različite komponente sučelja import java.awt.*;

Page 40: Java Aplet

Marina Ivašić, Java 40

public class sucelje1 extends java.applet.Applet{

Button Pravokutnik,Krug,Elipsa, Kvadrat;

int boja=1;

public void init(){

Pravokutnik=new Button("Pravokutnik");

add(Pravokutnik);

Kvadrat=new Button("Kvadrat");

add(Kvadrat);

Krug=new Button("Krug");

add(Krug);

Elipsa=new Button("Elipsa");

add(Elipsa);

}

public boolean action(Event e, Object arg){

if (arg=="Pravokutnik")

boja=1;

else if (arg=="Krug")

boja=2;

else if (arg=="Elipsa")

boja=3;

else boja = 4;

repaint();

return true;

}

public void paint(Graphics g){

switch (boja){

case 1:

g.setColor(Color.red);

g.fillRect(80,60,60,40);

break;

case 2:

g.setColor(Color.green);

g.fillOval(80,60,40,40);

break;

case 3:

g.setColor(Color.yellow);

g.fillOval(80,60,60,30);

break;

case 4:

g.setColor(Color.blue);

g.fillRect(80,60,40,40);

}

}

}

Ili

Implementiranje sučelja ActionListener iz paketa java.awt.event.* i nadjačavanje metode:

public void actionPerformed ( ActionEvent e ) {

}

Te povezati metode događaja sa komponentama sučelja kao npr:

b1.addActionListener( this );

Page 41: Java Aplet

Marina Ivašić, Java 41

Upotrebom operatora getSource()instance e klase Event, potrebno je provjeriti na kojoj

komponenti se zbio događa:

public void actionPerformed(ActionEvent e) {

// TODO Auto-generated method stub

if (e.getSource() == b1)

// kod

else if (e.getSource() == b2)

// kod

repaint();

}

Pr.

import java.applet.Applet;

import java.awt.*;

public class sucelje3 extends Applet implements ActionListener {

private Button b1, b2,b3,b4;

public void init() {

//this.setLayout(NULL);

Label l1,l2;

l1 = new Label("Kultura");

l2 = new Label("Sport");

b1 = new Button ("Film");

b2 = new Button ("Ski");

b3 = new Button ("Glazba");

b4 = new Button ("Odbojka");

Panel pozadina1 = new Panel();

pozadina1.setLayout(new GridLayout(3,2));

Font pismo = new Font("Tahoma", Font.CENTER_BASELINE+Font.BOLD, 14);

setFont(pismo);

pozadina1.add(l1);

pozadina1.add(l2);

pozadina1.add(b1);

pozadina1.add(b2);

pozadina1.add(b3);

pozadina1.add(b4);

add(pozadina1);

b1.addActionListener(this);

b2.addActionListener(this);

b3.addActionListener(this);

b4.addActionListener(this);

}

@Override

public void actionPerformed(ActionEvent e) {

if (e.getSource() == b1)

Page 42: Java Aplet

Marina Ivašić, Java 42

add(new TextField("Film je ...... "));

else if (e.getSource() == b2)

b2.setLabel("Skijanje ");

repaint();

}

}