Predavanje br. index|1|2|3|4|5|6|7|8|9|10|11|12|13|14|HOME


Osmo predavanje – razmještaj komponenti

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


Kontrola razmještaja komponenti

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.

Razne implementacije LayoutManagera

Sučelje java.awt.LayoutManager implementirano je u više različitih klasa, kao što su:

 

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.


Razmještaj tipa FlowLayout

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());


Podešavanje poravnanja za 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.


Razdvajanje komponenti za FlowLayout

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>


Razmještaj tipa BorderLayout

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 tipa CardLayout

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>


Uporaba CardLayout razmještaja

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.


Promjena karata

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)

Razmještaj tipa GridLayout

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>

 
 
 


 
 

Razmještaj tipa GridBagLayout

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().


Specifikacije GridBagConstraints

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>

Mreža (grid) za applet Calculator

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

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

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

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:

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;


Atributi ipadx i ipady

Svaka 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

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);


Atribut anchor

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

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.


Atributi weightx i weighty

Atributi 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.


Primjer za GridBagLayout

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);