Prosim, da, v kolikor želite to besedilo objaviti kje drugje, to storite tako, da linkate povezavo do te strani, ne pa da kopirate besedilo na drugo stran. S pisanjem teh nasvetov si (brez pričakovanja plačila) trgam dragocen čas.
Ti nasveti obravnavajo zaenkrat le ustvarjanje izgleda grafičnega vmesnika, ne pa še funkcionalnosti.
Edit: To besedilo sem po pobudi našega asistenta popravil, ker je imelo nekaj napak.
NAJ TI NAVETI NE BODO (EDINA?) OSNOVA ZA OPRAVLJANJE IZPITA! ZA MOREBITNI NEOPRAVLJEN IZPIT NE ODGOVARJAM!
Abstract Window Toolkit
»Nabor abstraktnih okenskih orodij«
AWT je v Javi nabor razredov in vmesnikov, s katerimi delamo za svoje programe grafični vmesnik. Java je v osnovi
konzolni (tekstovni) programski jezik in AWT ji doda zmožnost kreiranja grafičnega vmesnika. AWT je nabor okenskih orodij, ki omogoča grafični vmesnik
neodvisno od okolja izvajanja. Grafični izgled vmesnika se podreja samim grafično-oblikovnim karakteristikam sistema, v katerem se program zaganja. To pomeni, da bo vaš program izgledal v Windowsih XP drugače, kot v Windowsih 2000, tam pa spet drugače kot v Linuxu.
Osnovni gradniki in ostala orodja se nahajajo v razredu
java.awt
in ta razred morate vključiti v vaš projekt. Izdelave grafičnega okolja se lahko lotite na dva načina: eden je, da ustvarite nov objekt tipa Frame:
Frame glavnoOkno=new Frame();
in nato delate z njim kot z vsakim drugim objektom. Drug način pa je, da za podstrukture smiselno in logično ustvarjate podrazrede, ki dedujejo od ustreznih orodij:
class GlavnoOkno extends Frame { ... }
v vašem glavnem programu pa ustvarite objekt tega tipa:
GlavnoOkno glavnoOkno=new GlavnoOkno();
Frame in ostali vsebniki
Frame je vsebnik in ima izgled okna. V vašem programu lahko naredite koliko oken želite. V vsako od teh oken nato dodate vsebnike (container), v te pa gradnike (gumbe, polja z besedilom, besedila, ...). Pomembno se je zavedati, da so vsebniki tudi gradniki, torej jih lahko dodate v vsebnike in tako ustvarite gnezdeno strukturo.
Če ste se odločili za uporabo podrazredov, ustvarite nov razred za svoje okno z naslednjimi ukazi:
class GlavnoOkno extends Frame {
public GlavnoOkno() {
//Tukaj napolnite okno s vsebino, na primer:
add(new Button("Prvi gumb" ));
}
}
//V glavnem programu:
GlavnoOkno glavnoOkno=new GlavnoOkno();
glavnoOkno.setVisible(true);
Vidite lahko, da ste ustvarili nov razred GlavnoOkno, katerega konstruktor boste sprogramirali, da bo dodal elemente v samega vase. Ko v glavnem programu nato naredite objekt vašega novega tipa, se požene konstruktor in ga ustrezno oblikuje. Prednost metode s podrazredi je, da en razred predstavlja neko okno kot logično celoto - pozneje, ko boste dodajali npr. gumbe, si boste želeli zapomniti reference do nekaterih in jih boste dodali kot atribut razreda GlavnoOkno.
Enak primer zgornjemu primeru, le z direktno kreacijo objektov:
//V glavnem programu:
Frame glavnoOkno=new Frame();
//Tukaj napolnite okno s vsebino, na primer:
glavnoOkno.add(new Button("Prvi gumb" );
glavnoOkno.setVisible(true);
Ta metoda sicer trenutno zgleda enostavnejša, kot prejšnja, vendar pa je prejšnja veliko bolj razvidna in logična, ko oblikujete zelo zapleten grafični vmesnik.
Layout Manager
Layout manager (razporejevalnik) je sistem, s katerim zadolžite AWT, da razvršča vaše grafične elemente (gradnike). Layout manager nastavljate vsebnikom. Razred Panel je eden od vsebnikov, predstavlja pa strukturo pravokotne oblike, v katero nato dodajate vaše gradnike. (tudi aplet (razred Aplet) je otrok (podeduje od) razreda Panel, zato si lahko predstavljate Panel kot neke vrste aplet, le da ga tokrat postavite v vaš grafični vmesnik, ne v spletno stran (aplet se po funkcionalnosti seveda razlikuje od panela, saj je samostojna struktura, ki jo uporabljamo v druge namene kot panel))
Osnovni Layout Managerji so naslednji:
- null - če nastavite vsebnik na null, morate vsakemu gradniku, ki ga dodate, točno nastaviti velikost in pozicijo v vsebniku
- java.awt.FlowLayout - ta dodaja gradnike enega za drugim, ponavadi od leve proti desni, od zgoraj navzdol
- java.awt.GridLayout - ta razdeli vsebnik na mrežo in dodaja gradnike enega po enega v to mrežo
- java.awt.GridBagLayout - ta razdeli vsebnik na mrežo, vendar imate pri oblikovanju same mreže več svobode, saj lahko posamezne celice združujete, gradnike pa ni nujno vstavljati po vrsti, kot je to pri GridLayout
- java.awt.BorderLayout - ta dodaja gradnike na pet predefiniranih področij (sever, jug, vzhod, zahod in center)
- java.awt.CardLayout - ta ustvari navidezne "karte", katere lahko nato menjujete tako, da jih dajete v ospredje, ali pa jih pošljete v ozadje. Na vsaki karti je le en gradnik (tudi vsebnik je lahko gradnik!)
Ko ustvarite vsebnik, ima ta ob deklaraciji privzet layout manager. Panel-u (torej tudi v Apletu) je privzet FlowLayout, Frame-u (običajno okno z naslovno vrstico) in Dialog-u (pogovorno okno) pa je privzet BorderLayout. Če želite vsebniku nastaviti drug layout, to storite z naslednjim stavkom:
vsebnik.setLayout(Layout layout);
kjer je layout seveda eden od zgoraj naštetih layout-ov. Primer nastavitve BorderLayouta Panelu:
mojPanel.setLayout(new BorderLayout() );
Tipični konstruktorji Layout Managerjev
Raznoliki konstruktorji Layout Managerjev omogočajo prilagoditev samega Layout Managerja že med stvaritvijo (besedica new). Reference na nekatere Layout Managerje si je smiselno zapomniti, spet na druge ne. Če boste Layout Managerja kasneje rabili, ga naredite na primer na naslednji način:
GridBagLayout gbl=new GridBagLayout();
vsebnik.setLayout(gbl);
če ne, pa kar direktno:
vsebnik.setLayout(new GridBagLayout());
Tudi, če ste ga uporabili kar direktno, ga še vseeno lahko najdete z metodo
vsebnik.getLayout().
null
Null ni dejansko ime Layout Managerja. Če nekemu vsebniku nastavite Layout Manager na null, ste mu s tem odvzeli Layout Manager in vsem gradnikom na tem vsebniku morate določiti absolutno pozicijo in velikost.
vsebnik.setLayout(null); //tako vsebniku odvzamete Layout Manager
FlowLayout
new FlowLayout()
new FlowLayout(int poravnava)
new FlowLayout(int poravnava, int presledekVVodoravniSmeri, int presledekVNavpicniSmeri)
poravnava je lahko:
- FlowLayout.LEFT
- FlowLayout.CENTER
- FlowLayout.RIGHT
Presledek v vodoravni/navpični smeri pa pove, koliko prostora (v zaslonskih točkah oz. pixlih) naj bo med gradniki v ustrezni smeri (privzeto 5).
GridLayout
new GridLayout()
new GridLayout(int steviloVrstic, int steviloStolpcev)
new GridLayout(int steviloVrstic, int steviloStolpcev, int presledekVVodoravniSmeri, int presledekVNavpicniSmeri)
Število vrstic/stolpcev je število vrstic in stolpcev mreže, ki naj jih GridLayout uporablja pri vstavljanju gradnikov.
GridBagLayout
new GridBagLayout()
Ta Layout Manager ima le en konstruktor. Kam naj kakšen gradnik postavi in druge lastnosti, določimo ob samem dodajanju gradnika v vsebnik s objektom tipa java.awt.GridBagConstraints, a več o tem v poglavju o dodajanju.
BorderLayout
new BorderLayout()
new BorderLayout(int presledekVVodoravniSmeri, int presledekVNavpicniSmeri)
CardLayout
new CardLayout()
new CardLayout(int presledekVVodoravniSmeri, int presledekVNavpicniSmeri)
Dodajanje gradnikov pri različnih Layout Managerjih
Kako dodajamo gradnike v vsebnik je odvisno od tega, kakšen Layout Manager ima le-ta nastavljen. Univerzalna sintaksa dodajanja gradnika na vsebnik je ena od naslednjih:
(1*) vsebnik.add(Component gradnik) //Doda gradnik na naslednje prosto mesto
(2*) vsebnik.add(Component gradnik, int p) //Gradnik vrine na p-to mesto med že obstoječe gradnike
(3*) vsebnik.add(Component gradnik, Object omejitve) //Doda gradnik z omejitvami
(4*) vsebnik.add(Component gradnik, Object omejitve, int pozicija) //Gradnik z omejitvami vrine na p-to mesto med že obstoječe gradnike
Katero od teh metod je mogoče uporabiti in kako se bodo obnašale, je odvisno od Layout Managerja.
null
Brez Layout Managerja je smiselno uporabljati le metodo 1*. Gradniku moremo pred dodajanjem nastaviti velikost in pozicijo:
gradnik.setBounds(int x, int y, int sirina, int dolzina);
X in y sta koordinati pozicije (x,y) zgornjega levega kota gradnika. (0,0) je zgornji levi kot vsebnika, na katerega dodajate gradnik.
FlowLayout
Metoda 1*: Gradniki se dodajajo po pravilu branja: od leve proti desni in nato od zgoraj navzdol. Če se velikost vsebnika spremeni, se spremeni tudi pozicija njegovih gradnikov (torej - če se vsebnik preveč zoži, se vsi gradniki, ki se jih sicer nebi več videlo, prestavijo v nove vrstice).
GridLayout
Metoda 1*: Gradnik se doda v naslednje polje. Če so meje mreže določene, imajo pri polnitvi prednost vrstice - dokler je gradnikov manj kot je število vrstic, se le-ti dodajajo navpično eden pod drugega. Ko vrstic zmanjka, se gradniki prerazporedijo v dve koloni in se nato dodajajo po pravilu branja. Ko spet zmanjka prostora, se naredijo tri kolone itn...
Metoda 2*: Gradnik se doda na pozicijo pozicija. Pozicija 0 je zgornje levo polje, pozicija 1 je polje desno od njega itd... Pozicije ne moremo preskakovati! Ta metoda je torej dobra le za to, če želimo vriniti nov gradnik med polja, ki so že polna.
GridBagLayout
Metoda 1*: Gradnik se doda v naslednje polje. Za vrstni red dodajanja velja pravilo branja.
Metoda 2*: Se uporablja za vrivanje novih gradnikov, kot pri GridLayout in pri vseh ostalih. (ne bo več omenjena)
Metoda 3*: Pri tej metodi pa moramo ustvariti objekt omejitev tipa java.awt.GridBagConstraints, ki ga nato podamo kot argument v add metodi (Object omejitve). Ustvarimo ga lahko na dva načina:
new GridBagConstraints();
new GridBagConstraints(int gridx, int gridy, int gridwidth, int gridheight, double weightx, double weighty, int anchor, int fill, Insets insets, int ipadx, int ipady)
V drugem konstrukturju lahko nastavite vse atribute razreda. Vsi ti atributi so v vsakem takem razredu tudi javni in jih lahko direktno spreminjate. Pomeni atributov:
Metoda
4*: Podobno kot metoda 3*, vendar se uporablja za vrivanje novih gradnikov med obstoječe (podobno kot metoda 2*) (ne bo več omenjena)
BorderLayout
Metoda 1*: Gradnik se doda v območje BorderLayout.CENTER (sredina).
Metoda 3*: Argument omejitve mora biti pri tem Layout Managerju tipa String, pomeni pa, v katero območje se naj gradnik doda. Možne vrednosti tega argumenta:
- BorderLayout.CENTER - postavi na sredinsko območje
- BorderLayout.NORTH - postavi na zgornje (severno) območje
- BorderLayout.SOUTH - postavi na spodnje (južno) območje
- BorderLayout.EAST - postavi na desno (vzhodno) območje
- BorderLayout.WEST - postavi na levo (zahodno) območje
CardLayout
Metoda 1*: Ta metoda ni možna (glej metodo 3*)
Metoda 3*: Gradnik se doda na dno že obstoječih "kart". Priredi se mu ime, ki ga podamo v argumentu omejitve (kljub tipu argumenta Object, je ime seveda tipa String (kar je v bistvu tudi Object)).
"Karte" nato menjavate z eno od naslednjih metod, ki si jih lasti razporejevalnik:
CardLayout mojCL=(CardLayout)vsebnik.getLayout(); //Dobi referenco od CardLayout Managerja
//Tega ni potrebno storiti, če ste si zapomnili referenco CardLayout-a, ko ste ga prirejali vmesniku
- mojCL.first(Container vsebnik) -- pokaže prvo karto
- mojCL.last(Container vsebnik) -- pokaže zadnjo karto
- mojCL.next(Container vsebnik) -- pokaže naslednjo karto
- mojCL.previous(Container vsebnik) -- pokaže prejšnjo karto
- mojCL.show(Container vsebnik, String imeKarte) -- pokaže karto z imenom imeKarte
Primer uporabe CardLayout Layout Managerja
Primer prikazuje, kako naložimo karte eno na drugo in kako nato med njimi menjujemo.
PREBERITE IN UPOŠTEVAJTE KOMENTARJE!
PrimerCardLayout.java