Java Aplet
Transcript of 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
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.
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,
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)
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
}
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>
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)
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);
}
}
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
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
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
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.
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
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:
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.
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);
}
}
}
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
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 .
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()
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;
}
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
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()
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()
}
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;
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);
}
}
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);
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.*;
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) {
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) {
}
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 );
}
}
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();
}
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 );
}
}
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");
} }
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);
}
}
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);
}
}
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
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
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");
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.*;
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 );
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)
Marina Ivašić, Java 42
add(new TextField("Film je ...... "));
else if (e.getSource() == b2)
b2.setLabel("Skijanje ");
repaint();
}
}