Predavanje br. index|1|2|3|4|5|6|7|8|9|10|11|12|13|14|HOME
Kontrola razmještaja komponenti – razne implementacije
layout managera – razmještaj tipa FlowLayout – podešavanje poravnanja za
FlowLayout – razdvajanje komponenti za FlowLayout – razmještaj tipa BorderLayout
– razmještaj tipa CardLayout – uporaba CardLayout razmještaja – promjena karata
– razmještaj tipa GridLayout – razmještaj tipa BridBagLayout –razmještaj tipa
GridBagConstraints – mreža (grid) za applet Calculator – atributi gridx i gridy
– atributi gridwidth i gridheight – atribut fill – atributi ipadx i ipady –
klasa Insets – atribut anchor – atributi weightx i weighty – primjer za
GridLayout – ručno pozicioniranje komponenti – Kontejneri – dvije vrste
kontejnera – paneli – ugnježdeni paneli – prozori (windows) – okviri (frames) –
događaji vezani uz prozore – primjer događaja na prozorima – kombiniranje
appleta i aplikacija – dijalozi – metode za dijaloge – primjeri dijaloga –
pisanje podklasa klase Dialog
Kontrolu nad pozicijama komponenti koje dodajete razmještaju omogućuje vam
sučelje java.awt.LayoutManager.
Budući da ne možete unaprijed znati s kako velikom površinom ćete raditi ili
kakvog će ona biti oblika, kontrola će biti relativna, dakle uglavnom ćete
odlučivati o tome treba li neka komponenta biti iznad ili ispod druge, poravnata
lijevo ili desno, ali u pravilu nećete određivati da se komponenta treba
pojaviti baš u nekoj specifičnoj točki.
Sučelje java.awt.LayoutManager
implementirano je u više različitih klasa, kao što su:
java.awt.FlowLayout
java.awt.BorderLayout
java.awt.CardLayout
java.awt.GridLayout
java.awt.GridBagLayout
Appleti ili kontejneri imaju mogućnost koristiti ove i druge layout managere da bi odlučili gdje će staviti komponente koje u njih dodajete.
Klasa java.awt.FlowLayout
raspoređuje komponente s lijeva na desno dok ima prostora, a tada nastavlja na
isti način u retku ispod. Svaka komponenta u FlowLayout
razmještaju dobija upravo onoliko prostora koliko joj minimalno treba i ništa
više. Takav je razmještaj koristan za raspoređivanje buttona, ali za mnoge druge
stvari nije. On je pretpostavljeni (default) razmještaj za applete i
panele (posebne kontejnere o kojima će malo kasnije biti riječi).
Klasa java.awt.BorderLayout
organizira applet na sekcije prema stranama svijeta: North, South, East, West i
Center. North, South, East i West su pravokutnici na rubovima appleta. Oni se
kontinuirano šire prema veličini komponenata u njima. Center je ono što
preostane u središtu.
Klasa java.awt.CardLayout
razbija applet u skupinu površina (karata) koje imaju svaka svoj vlastite
razmještaj. U svakom trenutku samo se jedna karta pojavljuje na ekranu. Korisnik
može prebacivati izgled ekrana s jedne na drugu kartu, a svaka prikazuje
različite skupove komponenti. Obično se to uspoređuje sa HyperCardom na
Macu ili Toolbookom on Windowsima. U Javi se to može koristiti kao serija maski za
unos podataka ako sva polja ne mogu stati na ekran.
Klasa java.awt.GridLayout
dijeli applet na određeni broj redaka i stupaca te tako formira mrežu ćelija kao
matricu. Kako se koja komponenta dodaje, ona se smješta u sljedeću slobodnu
ćeliju, počevši od lijevog ugla prema desno i prema dolje. Svaka komponenta se
podešava po veličini tako da pristaje u ćeliju. Takav razmještaj će neke
komponente nepotrebno stisnuti, a neke razvući, ali je jako pogodan za
razmještanje panela.
Klasa java.awt.GridBagLayout
daje najprecizniji od svih AWT razmještaja. Razmještaj je kao i GridLayout,
ali komponente ne moraju biti iste veličine. Svaka komponenta može zauzeti jednu
ili više ćelija. Štaviše, komponente nisu nužno smještene u ćelije počevši od
gornjeg lijevog ugla niti se moraju dodavati prema desno i prema dolje.
U jednostavnim appletima sa samo nekoliko komponenti bit će dovoljan jedan razmještaj. U kompliciranijima, međutim, često ćete razbiti applet na panele, rasporediti ih prema nekom razmještaju, a onda svaki panel snabdjeti vlastitim layout managerom za raspoređivanje komponenti unutar njega.
Klasa java.awt.FlowLayout
raspoređuje komponente s lijeva na desno dok ima prostora, a tada nastavlja isti
postupak redak niže. Svaka komponenta dobija upravo toliko mjesta koliko joj
treba i ništa više. Ovaj je tip razmještaja najkorisniji za raspoređivanje
buttona.
FlowLayout je
pretpostavljeni (default) razmještaj za java.awt.Panel
koji je nadklasa od java.applet.Applet.
Prema tome ne trebate učiniti ništa posebno da biste FlowLayout
kreirali unutar appleta. Međutim, ako ga želite koristiti unutar prozora,
java.awt.Window,
trebat će vam odgovarajući konstruktori.
Razmještaji imaju konstruktore kao i ostale klase. Jedan od konstruktora za
FlowLayout
je:
public
FlowLayout()
Dakle, za kreiranje novog objekta tipa FlowLayout
pišete:
FlowLayout fl;fl = new FlowLayout();Kao i obično, to se može skratiti na:
FlowLayout fl = new
FlowLayout();
Appletu
ćete reći koju specifičnu instancu klase LayoutManager
želite koristiti, tako da taj objekt navedete u appletovoj metodi setLayout().
Ovu metodu klasa java.applet.Applet
nasljeđuje, kao i mnoge druge, iz klase java.awt.Container.
this.setLayout(fl);
Metoda
setLayout() se
uglavnom poziva u init() metodi.
Uobičajeno je kreirati primjerak razmještaja direktno unutar poziva metode
setLayout()
ovako:
this.setLayout(new
FlowLayout());
Poravnanje
za neki FlowLayout
zadajete pomoću odgovarajućeg konstruktora. Komponente su u appletu po
pretpostavci centrirane. Možete umjesto toga odrediti da budu lijevo ili desno
pozicionirane. Za to možete koristiti gotove konstante FlowLayout.LEFT,
FlowLayout.RIGHT
ili FlowLayout.CENTER
prilikom pozivanja konstruktora, npr.
this.setLayout(new FlowLayout(FlowLayout.LEFT)); this.setLayout(new FlowLayout(FlowLayout.RIGHT)); this.setLayout(new FlowLayout(FlowLayout.CENTER));Pogledajmo sljedeći primjer u kojem se poravnanje zadaje pomoću parametra oznake <APPLET>.
import
java.applet.Applet;
import
java.awt.Button;
import
java.awt.FlowLayout;
public
class TapeDeckAlign extends Applet {
public void init()
{
FlowLayout
f;
String align =
getParameter("align");
if (align == null)
f
= new FlowLayout(FlowLayout.CENTER);
else if
(align.equalsIgnoreCase("left")) {
f = new
FlowLayout(FlowLayout.LEFT);
}
else if
(align.equalsIgnoreCase("right")) {
f = new
FlowLayout(FlowLayout.RIGHT);
}
else f
= new FlowLayout(FlowLayout.CENTER);
setLayout(f);
add( new
Button("Play"));
add( new
Button("Rewind"));
add( new Button("Fast
Forward"));
add( new
Button("Pause"));
add( new
Button("Stop"));
}
}
<APPLET
CODE="TapeDeckAlign.class"
CODEBASE="http://student.math.hr/~vedris/java/classes"
WIDTH=200
HEIGHT=100>
<param
name="align" value="left">
</APPLET>
S parametrom value="center", odnosno value="right" dobili bismo centrirani i desno pozicionirani razmještaj.
Većina
LayoutManagera
omogućuje vam kontrolu nad minimalnim vertikalnim i horizontalnim prostorom koji
razdvaja komponente. Za FlowLayout
zadajete željeni prostor u pikseleima, putem odgovarajućih argumenata u
konstruktoru:
public FlowLayout(int
alignment, int hspace, int vspace);
Na
primjer, da biste napravili FlowLayout sa
deset piksela horizontalnog i dvadeset piksela vertikalnog razmaka, sa lijevim
poravnanjem, koristili biste sljedeći konstruktor:
FlowLayout fl = new FlowLayout(FlowLayout.LEFT, 20, 10);
Pogledajte primjer appleta koji tako raspoređuje buttone nalik onima za VCR:
import java.applet.*; import java.awt.*; public class SpaceTapeDeck extends Applet { public void init() { this.setLayout( new FlowLayout(FlowLayout.LEFT, 20, 10)); this.add( new Button("Play")); this.add( new Button("Rewind")); this.add( new Button("Fast Forward")); this.add( new Button("Pause")); this.add( new Button("Stop")); } }<APPLET
CODE="SpaceTapeDeck.class"
CODEBASE="http://student.math.hr/~vedris/java/classes"
WIDTH=400
HEIGHT=100>
</APPLET>
Klasa
java.awt.BorderLayout
smješta objekte na NORTH, SOUTH, EAST, WEST ili CENTER unutar appleta. Da biste
kreirali novi objekt tipa BorderLayout,
pozovite, slično kao i za FlowLayout
unutar metode init() metodu
setLayout()
ovako:
this.setLayout(new BorderLayout());U ovom tipu razmještaja nema centriranja ni lijevog ili desnog poravnavanja, no možete dodati horizontalne i vertikalne razmake među komponentama. Na primjer, za horizontalni razmak od 5 piksela i vertikalni od 10 piksela, stavili bismo:
this.setLayout(new BorderLayout(5, 10));Kad želite dodati komponentu na određenu stranu, možete to učiniti na primjer ovako:
this.add(new Button("Start"), BorderLayout.SOUTH);
Kao što se iz sljedećeg primjera može vidjeti, sjeverna i južna sekcija protežu se preko appleta s lijeva na desno. Istočna i zapadna se protežu od dna sjeverne do vrha južne sekcije. Ove četiri komponente bit će onoliko velike koliko je potrebno da bi u njih stale komponente koje im dodijelite. Ono što ostane, biti će za centralnu sekciju. Točne veličine su nepredvidljive. Kao i točan način pakiranja komponenti unutar sekcija.
import java.applet.*; import java.awt.*; public class BorderButtons extends Applet { public void init() { this.setLayout(new BorderLayout(20, 10)); this.add(new Button("North"), BorderLayout.NORTH); this.add(new Button("South"), BorderLayout.SOUTH); this.add(new Button("East"), BorderLayout.EAST); this.add(new Button("West"), BorderLayout.WEST); this.add(new Button("Center"), BorderLayout.CENTER); } }<APPLET
CODE="BorderButtons.class"
CODEBASE="http://student.math.hr/~vedris/java/classes"
WIDTH=200
HEIGHT=100>
</APPLET>
Razmještaj
koji implementira klasa java.awt.CardLayout
je malo neuobičajen. On pretvara applet u snop karata, od kojih svaka
potencijalno ima svoj vlastiti LayoutManager.
U svakom trenutku na ekranu je vidljiva samo jedna karta. Možete prelaziti s
jedne karte na drugu, dovodeći tako svaki put na ekran drugi skup komponenti.
Postoji sličnost sa HyperCardom na Mac-u ili Toolbookom na
Windowsima. U Javi se takav razmještaj može koristiti kao niz ekrana za
unos ako svi podaci ne stanu na jedan. Ili se, ako treba prikazati više
podataka, može napraviti nešto kao slide show.
Na
primjer, pogledajte sljedeći applet, CardTest,
jedan od Sunovih standardnih demo appleta. Ovdje se koristi CardLayout za
prebacivanje s jednog razmještaja na drugi, pri čemu se na različite načine
raspoređuju isti buttoni:
<APPLET
CODE="CardTest.class"
CODEBASE="http://student.math.hr/~vedris/java/classes"
ARCHIVE="CardTest.jar"
WIDTH=400
HEIGHT=200>
</APPLET>
Ovaj
razmještaj kreirate pomoću konstruktora CardLayout()
ovako:
this.setLayout(new CardLayout());Na raspolaganju vam je još jedan konstruktor kojim možete odrediti razmak među komponentama:
this.setLayout(new CardLayout(3, 4));U ovom primjeru komponente će biti razmaknute 3 pixela horizontalno i 4 pixela vertikalno.
Svaka
karta ima ime. Nova karta se kreira kad dodate komponentu karti koja do tada
nije uvedena. Komponente dodajete tako da navedete ime karte i instancu
komponente u metodi add():
this.setLayout(new CardLayout());this.add("Pizza", new Label("How do you like your pizza?"));this.add("Pizza", new Button("OK"));this.add("Payment", new Label("How would you like to pay?"));this.add("Payment", new Button("OK"));this.add("Address", new Label("Delivery Instructions"));this.add("Address", new Button("Order"));Često se karte imenuju po brojevima:
this.setLayout(new CardLayout());this.add("1", new Label("First Card"));this.add("2", new Label("Second Card"));this.add("3", new Label("Third Card"));this.add("4", new Label("Fourth Card"));this.add("5", new Label("Fifth Card"));this.add("6", new Label("Sixth Card"));Interno
se popis karata i njihovih imena sprema u objekt tipa java.util.Hashtable.
To znači da nema garantiranog ili ugrađenog redoslijeda karata. O tome program
trebate sami voditi računa.
U
pravilu svakoj karti dodajete panel koji ima vlastiti LayoutManager.
Svaka karta treba biti snabdjevena nekim uputnicama za navigaciju među kartama.
Sam AWT nema gotovog takvog alata. Primijetite također da jednu komponentu
možete dodati na više od jedne karte. To je korisno, na primjer, za kreiranje
Choice
izbornika sa imenima svih karata kao navigacijskim pomagalom.
Sljedećih
pet metoda klase java.awt.CardLayout
omogućuje promjenu aktivne karte. U svim slučajevima treba specificirati
kontejner unutar kojega prelazimo s karte na kartu. To može biti applet, prozor
ili panel koji je uređen u skladu s tim razmještajem.
public void first(Container parent) public void next(Container parent) public void previous(Container parent) public void last(Container parent) public void show(Container parent, String name)
Klasa
java.awt.GridLayout
specificira broj redaka i stupaca u koje će komponente biti smještene. Applet se
razbija na matricu jednako velikih ćelija.
GridLayout je
koristan kad želite razmjestiti više objekata slične veličine. Jako je dobar za
sastavljanje liste checkboxova ili radio buttona kao u appletu Ingredients iz
šestog predavanja. U sljedećem primjeru donosimo malo izmijenjenu verziju tog
appleta pa ćemo checkboxove rasporediti unutar šest redaka i jedne kolone, što
će appletu dati mnogo bolji i uredniji izgled. Uklonjen je kod za obradu
događaja jer nije bitan za ovaj primjer.
import java.applet.*;
import java.awt.*;
public class Ingredients2 extends Applet { TextField t; double price = 7.00; public void init() { this.setLayout(new GridLayout(11,1)); this.add(new Label("What do you want on your pizza?", Label.CENTER)); this.add(new Checkbox("Pepperoni")); this.add(new Checkbox("Olives")); this.add(new Checkbox("Onions")); this.add(new Checkbox("Sausage")); this.add(new Checkbox("Peppers")); this.add(new Checkbox("Extra Cheese")); this.add(new Checkbox("Ham")); this.add(new Checkbox("Pineapple")); this.add(new Checkbox("Anchovies")); this.t = new TextField("$" + String.valueOf(price)); this.t.setEditable(false); this.add(this.t); } /* ovdje dolazi kod za obradu dogadjaja koji je iz ovog primjera uklonjen */}
<APPLET
CODE="Ingredients2.class"
CODEBASE="http://student.math.hr/~vedris/java/classes"
WIDTH=200
HEIGHT=250>
</APPLET>
Klasa
java.awt.GridBagLayout
daje mrežu za raspoređivanje komponenti, slično kao GridLayout,
ali dopušta da pojedina komponenta zauzme više od jedne ćelije. Također, ovdje
se veličina ćelije prilagođava veličini komponente, a ne obrnuto, kao što smo do
sada navikli.
Konstruktor
za GridBagLayout
je trivijalan, GridBagLayout()
bez argumenata. Koristite ga ovako:
GridBagLayout gbl = new
GridBagLayout();
setLayout(gbl);
Za
razliku od konstruktora za GridLayout()
ovaj ne kaže koliko redaka ili stupaca treba napraviti. To se određuje prema
ćelijama koje vaš program referencira. Ako stavite komponentu u osmi redak i
drugi stupac, Java će osigurati da bude bardevet redaka i tri stupca (retci i
stupci započinju od nultog). Ako kasnije stavite komponentu u deseti redak i
četvrti stupac, Java će dodati odgovarajući broj ćelija. Možete zamišljati
konačnu mrežu, ali Java to ne mora znati kad kreirate GridBagLayout.
Za
razliku od većine ostalih razmještaja, referenca na objekt tipa GridBagLayout
trebat će vam kasnije u programu pa ga, dakle nećete kreirati anonimno, unutar
poziva metode setLayout().
Svakoj
komponenti koju kontrolira GridBagLayout
pridružen je po jedan objekt iz klase java.awt.GridBagConstraints
koji specificira položaj unutar površine za prikaz. Takav objekt zajedno sa
minimalnom i preferiranom veličinom komponente određuje gdje se i kako površina
za prikaz smješta unutar appleta.
Konstruktor
za GridBagConstraints()
je trivijalan:
GridBagConstraints gbc = new
GridBagConstraints();
Interakcija
s objektom tipa GridBagConstraints
odvija se preko jedanaest varijabli (gridx,
gridy,
gridwidth,
gridheight,
weightx,
weighty,
achor,
fill,
insets,
ipadx,
ipady)
i petnaest mnemoničkih konstanti (RELATIVE,
REMAINDER,
NONE,
BOTH,
HORIZONTAL,
VERTICAL,
CENTER,
NORTH,
NORTHEAST,
EAST,
SOUTHEAST,
SOUTH,
SOUTHWEST,
WEST,
NORTHWEST).
Pokazat
ćemo njihovu uporabu na primjeru appleta GridBagCalculatorApplet
koji predstavlja masku za kalkulator.
<APPLET CODE="GridBagCalculatorApplet.class"
CODEBASE="http://student.math.hr/~vedris/java/classes"
ARCHIVE="GridBagCalculator.jar"
WIDTH=1 HEIGHT=1>
</APPLET>
Evo
sada mreže koju koristimo za razmještaj kalkulatorovih komponenti. Primijetite
da u mreži ima više ćelija nego komponenti kalkulatora. Kalkulator ima jedan
TextField i 18
buttona različitih veličina. Neke komponente zauzet će više od jedne ćelije
mreže. Na primjer, TextField
koji predstavlja kalkulatorov display zauzet će četiri ćelije, (0, 0),
(1, 0), (2, 0), and (3, 0).
|
(0, 0) |
(1, 0) |
(2, 0) |
(3, 0) |
|
(0, 1) |
(1, 1) |
(2, 1) |
(3. 1) |
|
(0, 2) |
(1, 2) |
(2, 2) |
(3, 2) |
|
(0, 3) |
(1, 3) |
(2, 3) |
(3, 3) |
|
(0, 4) |
(1, 4) |
(2, 4) |
(3, 4) |
|
(0, 5) |
(1, 5) |
(2, 5) |
(3, 5) |
Za svaku komponentu kreirat ćemo po jedan objekt tipa GridBagConstraints. Na primjer za display, equals key i zero key imat ćemo
GridBagConstraints GBC_display =
new GridBagConstraints();
GridBagConstraints
GBC_bigequals = new GridBagConstraints();
GridBagConstraints GBC_0 =
new GridBagConstraints();
Nakon što postavimo vrijednosti odgovarajućih atributa, taj ćemo objekt pridružiti komponenti pomoću metode setConstraints() ovako:
gbl.setConstraints(display,
GBC_display);
gb1.setConstraints(bigequals, GBC_bigequals;
gbl.setConstraints(b0,
GBC_0);
Atributi
gridx i
gridy
specificiraju x i y "koordinate", tj. stupac i redak ćelije u koju će doći
lijevi gornji ugao komponente. Gornja lijeva ćelija u našem primjeru je ćelija
(0, 0). Umjesto apsolutnih vrijednosti možemo staviti i mnemoničku konstantu
GridBagConstraints.RELATIVE
koja kaže da će komponenta biti smještena neposredno desno (gridx) ili
neposredno ispod (gridy) u
odnosu na komponentu koja je prije toga posljednja bila dodana kontejneru.
Naš kalkulator ima display u lijevom gornjem uglu appleta. Prema tome, gridx i gridy prve komponente (to je TextField) izgledat će ovako:
GBC_display.gridx =
0;
GBC_display.gridy =
0;
Isto tako, na primjer, tipka za znak jednakosti (equals key) imat će
GBC_bigequals.gridx =
3;
GBC_bigequals.gridy =
4;
Tipka za znamenku 0 (zero key) imat će
GBC_0.gridx =
0;
GBC_0.gridy =
5;
Atributi
gridwidth i
gridheight
specificiraju broj ćelija u retku (gridwidth) ili
stupcu (gridheight)
koje će komponenta zauzeti. Ako ovdje upišemo mnemoničku konstantu GridBagConstraints.REMAINDER,
onda će komponenta zauzeti sve preostale ćelije u retku (za gridwidth) ili
stupcu (za gridheight).
Kalkulatorov display će zauzeti četiri ćelije po širini i jednu po visini, dakle imat ćemo
GBC_display.gridwidth = 4;
GBC_display.gridheight = 1;
Tipka za znak jednakosti (equals key) je dvije ćelije visok i jednu ćeliju širok, dakle
GBC_bigequals.gridwidth =
1;
GBC_bigequals.gridheight =
2;
Tipka za znamenku 0 (zero key) imat će
GBC_0.gridwidth =
2;
GBC_0.gridheight =
1;
Atribut
fill
specificira način na koji komponenta ispunjava prostor koji joj je dodijeljen (u
slučaju da je prostor veći od same komponente). Mnemoničke konstante koje
koristite za postavljanje ove varijable su:
GridBagConstraints.NONE:
komponenta ne mijenja veličinu
GridBagConstraints.HORIZONTAL:
Komponenta će se protezati preko cijele širine prostora koji joj je
dodijeljen, ali neće promijeniti svoju visinu
GridBagConstraints.VERTICAL:
Komponenta će se protezati preko cijele visine prostora koji joj je
dodijeljen, ali neće promjijeniti svoju širinu
GridBagConstraints.BOTH:
Širina i visina komponente bit će prilagođene tako da komponenta zauzme cijeli
prostor koji joj je dodijeljen U našem primjeru odredili smo da se display širi horizontalno, a tipke (pogledajmo na primjer zero key) u svim smjerovima, dakle
GBC_display.fill = GridBagConstraints.HORIZONTAL;
GBC_0.fill =
GridBagConstraints.BOTH;
ipadx
i ipadySvaka komponenta ima određenu minimalnu širinu i visinu i ne može se smanjivati ispod tih vrijednosti. Ako su minimalne dimenzije komponente veće od dimenzija površine koje joj stoje na raspolaganju, bit će prikazan samo dio komponente.
Atributi
ipadx i
ipady
dozvoljavaju vam da povećate te minimalne dimenzije tako da se rubovima
komponente doda nešto prostora . Na primjer, ako stavite ipadx =2, to
će garantirati da je komponenta najmanje 4 piksela šira od svog normalnog
minimuma. U našem primjeru to nije potrebno.
Atribut
insets je
instanca klase java.awt.Insets.
On specificira razmak između komponente i rubova površine na kojoj je smještena.
Za sve tipke u našem kalkulatoru odredili smo da to bude 3 piksela sa svake
strane (što osigurava da susjedne tipke budu razmaknute za 6 piksela), pa imamo
na primjer
GBC_bigequals.insets = new
Insets(3, 3, 3, 3);
GBC_0.insets = new Insets(3,
3, 3, 3);
Kad
je komponenta manje nego raspoloživa površina, atribut anchor
specificira položaj unutar ćelije kamo komponentu treba staviti. Mnemoničke
konstante koje za to koristite slične su onima za BorderLayout.
Tos u
GridBagConstraints.CENTER
GridBagConstraints.NORTH
GridBagConstraints.NORTHEAST
GridBagConstraints.EAST
GridBagConstraints.SOUTHEAST
GridBagConstraints.SOUTH
GridBagConstraints.SOUTHWEST
GridBagConstraints.WEST
GridBagConstraints.NORTHWEST
Pretpostavljena
vrijednost je GridBagConstraints.CENTER.
U našem primjeru to nije eksplicitno navedeno jer su komponente dovoljno velike
u odnosu na raspoložive površine, tako da je centrirana pozicija
zadovoljavajuća.
weightx
i weightyAtributi
weightx i
weighty
određuju kako su ćelije distribuirane unutar kontejnera ako njihova ukupna
veličina bude manja od veličine kontejnera. Sa težinama 0 (default) sve
ćelije zauzimaju najmanje što mogu i sve se sabije prema centru. Sav dodatni
prostor je izguran prema rubovima kontejnera.
Pogledajmo
sada kompletnu init() metoda
sa razmještajem kalkulatorovih tipaka.
public void init ()
{
GridBagLayout gbl = new
GridBagLayout();
setLayout(gbl);
// Add the display to the
top four cells
GridBagConstraints
GBC_display = new GridBagConstraints();
GBC_display.gridx =
0;
GBC_display.gridy =
0;
GBC_display.gridwidth =
4;
GBC_display.gridheight =
1;
GBC_display.fill =
GridBagConstraints.HORIZONTAL;
// add the text
field
TextField display = new
TextField(12);
gbl.setConstraints(display,
GBC_display);
add(display);
// Add the clear
button
GridBagConstraints GBC_clear
= new GridBagConstraints();
GBC_clear.gridx =
0;
GBC_clear.gridy =
1;
GBC_clear.gridwidth =
1;
GBC_clear.gridheight =
1;
GBC_clear.fill =
GridBagConstraints.BOTH;
GBC_clear.insets = new
Insets(3, 3, 3, 3);