Gestionarea poziționării componentelor

Am arătat în secțiunea precedentă cum se poate plasa într-un container (în particular într-un contentPane) o singură componentă. În mod normal însă, într-un comtainer se plasează mai multe componente. În acest caz, este foarte important să se stabilească modul în care aceste componente sunt poziționate pe suprafața containerului. În acest scop, a fost introdus conceptul de gestionar de poziționare (în engleză: Layout Manager).

Gestionarul de poziționare este o clasă care asigură poziționarea și redimensionarea automată a componentelor situate într-un container, atât la crearea containerului, cât și la modificarea dimensiunilor acestuia. Orice gestionar de poziționare implementează interfața java.awt.LayoutManager sau subinterfața acesteia java.awt.LauoutManager2. În cele ce urmează, vom studia cele mai larg utilizate clase de gestionare a poziționării, existente în pachetele java.awt și javax.swing.

Fiecare clasă de container are un gestionar de poziționare implicit. Acesta este BorderLayout pentru  Frame și JFrame.contentPane și FlowLayout pentru clasa Panel. Modificarea gestionarului de pozitionare se face prin metoda
    public void setLayout(LayoutManager manager)
din clasa java.awt.Container.
 

Clasa BorderLayout

Începem cu această clasă, deoarece este gestionarul de poziționare implicit pentru conținutul instanțelor clasei JFrame. În acest caz, se consideră că suprafața containerului este imparțită în cinci zone numite, respectiv, NORTH, SOUTH, WEST, EAST si CENTER. În fiecare din aceste zone se poate plasa numai o singură componentă, care poate fi însă ea însăși un container. Adăugarea de componente la container se face, în acest caz, folosind metoda add(componenta, BorderLayout.ZONA), unde componenta este referința la componenta adaugată, iar ZONA este una din cele cinci zone menționate mai sus. Dacă se folosește metoda add(componenta), fără a indica zona, componenta respectivă este plasată implicit în zona CENTER, așa cum s-a procedat în secțiunea precedenta, în exemplul din fișierul AdComp.java.
 
Exemplu
În fișierul Butoane.java este dat un exemplu,  în care se plasează în fereastra aplicației câte un buton  în fiecare din zonele NORTH,WEST, CENTER și EAST și o etichetă (instanță a clasei javax.swing.JLabel) în zona SOUTH. Pe suprafața fiecărui buton este afișat numărul de apăsări succesive. În eticheta de la partea de jos se afișează numărul total de acționări asupra tuturor butoanelor. 
 
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

class Butoane { 
 static AF af=new AF(); // ascultatorul de fereastra
 static AA aa=new AA(); // ascultatorul de actiuni
 static IUG iug=new IUG("Adaugare de butoane");
 static int totalActionari=0;

 static class IUG extends JFrame {
  JLabel lab=new JLabel("Actionati butoanele");
  ButonContor b1, b2, b3, b4; 

  IUG(String titlu) {
   super(titlu);
   Container cp=getContentPane();
   setSize(400,300);
   setLocation(200,150);
   addWindowListener(af);
   b1=new ButonContor("N");
   b1.addActionListener(aa);
   cp.add(b1, BorderLayout.NORTH);
   b2=new ButonContor("E");
   b2.addActionListener(aa);
   cp.add(b2, BorderLayout.EAST);
   b3=new ButonContor("W");
   b3.addActionListener(aa);
   cp.add(b3, BorderLayout.WEST);
   b4=new ButonContor("C");
   b4.addActionListener(aa);
   cp.add(b4, BorderLayout.CENTER);
   cp.add(lab, BorderLayout.SOUTH);
   setVisible(true);
  }
 }

 static class AA implements ActionListener {
  public void actionPerformed(ActionEvent e) {
    totalActionari++;
    iug.lab.setText("Total actionari: "+totalActionari);
  }
 }

 static class AF extends WindowAdapter {
  public void windowClosing(WindowEvent e) {
   System.exit(0);
  }
 }

 public static void main(String args[]) {
 }
}

Remarcăm următoarele:
  - clasa ButonContor extinde clasa JButton și implementează interfața ActionListener, fiind definită de noi ca o clasa publică în fișierul ButonContor.java.  În constructorul acestei clase există instrucțiunea addActionListener(this), astfel că fiecare buton își ascultă propriile evenimente de acțiune;
  - în metoda actionPerformed(ActionEvent e) din clasa ButonContor se incrementează contorul intern al butonului respectiv și se afișează valoarea contorului pe suprafața butonului;
  - în constructorul clasei imbricate IUG se adaugă câte un ButonContor în fiecare din zonele NORTH, WEST, EAST si CENTER ale ferestrei principale.
  - pentru a fi totalizat numărul de apăsări al tuturor butoanelor, la fiecare buton se adaugă, de asemenea, ascultătorul de acțiune ac, instanță a clasei AC, care incrementează câmpul total al clasei Butoane;
  - eticheta din zona SOUTH face parte din clasa javax.swing.JLabel. Instanțele acestei clase au ca principal rol afișarea pe suprafața lor a unui text și/sau a unei pictograme. În exemplul nostru se afișează numarul total de acționări ale butoanelor (valoarea câmpului total al clasei Butoane);
  - adăugarea la fereastra aplicației a butoanelor și a etichetei se face în constructorul clasei IUG. 

Punând în execuție această aplicație, putem vedea cum se plasează cele cinci componente pe suprafața ferestrei. Putem urmări, de asemenea, cum se modifică automat dimensiunile componentelor atunci când modificăm cu mouse-ul dimensiunile ferestrei. Dacă facem click de mouse pe oricare din butoane, se modifică atât contorul afișat pe butonul respectiv, cât și numărul total de acționari afișat pe eticheta din partea inferioară a ferestrei.



© Copyright 2000 - Severin BUMBARU, Universitatea "Dunărea de Jos" din Galați