Adăugarea unei componente la fereastra principală a aplicației

Până în prezent, am arătat că, atunci când folosim JFC/Swing, fereastra principală a aplicației este o instanță a clasei javax.swing.JFrame sau a unei subclase a acesteia. Pentru a construi o interfață utilizator grafică este necesar ca în fereastra principală să introducem diverse componente. Acestea pot fi componente simple, ca etichete, butoane, casete de validare, câmpuri de text etc., sau pot fi containere, care conțin - la rândul lor - alte componente. Pentru realizarea acestor componente simple și containere se folosesc clasele din pachetele java.awt și javax.swing, care sunt descrise în documentația Java API.

Adăugarea de componente nu se face direct la instanțele clasei JFrame. În JFrame există un Container (un obiect dintr-o subclasă a clasei Container) numit contentPane, la care se pot adăuga componente. O referință la acest Container se obține prin metoda public Container getContentPane(), existentă în clasa JFrame. Adăugarea de componente se face prin una din metodele add() ale clasei Container. Dacă, de exemplu, comp este referință la o componentă, atunci expresia getContentPane().add(comp), folosită într-o metodă a clasei JFrame sau a subclaselor ei, adaugă componenta comp la containerul contentPane conținut în JFrame.

O prezentare succintă a clasei JFrame este dată în Indexul de clase, iar cea completă se găsește în Java API, completată cu cea din Tutorialul Java.
 
Exemplul 1
În fișierul AdComp.java este un exemplu de aplicație, în care se testează adăugarea la fereastra principală a unui buton și se face contorizarea numărului de apăsări pe butonul respectiv. În acest exemplu se arată:
  - cum se adaugă la fereastra aplicației un buton (o instanță a clasei JButton);
  - cum se tratează evenimentele de acțiune generate la apasarea butonului.
În locul unui buton se putea folosi orice altă componentă.
 
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

class AdComp { 
 static String textButon="Numar de actionari: ";
 static int contorActionari=0;
 static AF af=new AF();
 static AB ab=new AB();
 static JButton buton=new JButton(textButon+contorActionari);
 static IUG iug=new IUG("Un buton de contorizare a apasarilor");

 /* clasa imbricata pentru interfata utilizator grafica */
 static class IUG extends JFrame {

  IUG(String titlu) { // constructorul clasei IUG
   super(titlu);
   setSize(300, 80);
   setLocation(200, 150);
   getContentPane().add(buton); // adaugarea butonului
   addWindowListener(af);  // adaugarea ascultatorului de fereastra
   buton.addActionListener(ab); // adaugarea ascult. de actiune
   setVisible(true);
  }
 } 

 /* Clasa ascultatoare de fereastra */ 
 static class AF extends WindowAdapter {
  public void windowClosing(WindowEvent e) {
   System.exit(0); // incheierea executarii aplicatiei
  }
 }

 /* Clasa ascultatoare de actiuni asupra butonului */
 static class AB implements ActionListener {
  public void actionPerformed(ActionEvent e) {
   contorActionari++;
   buton.setText(textButon+contorActionari);
  }
 }

 /* Metoda principala a aplicatiei */
 public static void main(String args[]) {
 }
}

Remarcăm următoarele:
  - S-au declarat trei clase imbricate:
    . clasa IUG, care este interfața utilizator grafică;
    . clasa AF, care este ascultătorul evenimentelor de fereastră, necesar pentru închiderea aplicației;
    . clasa AB, care asculta și tratează evenimentele de acțiune generate de buton.
  - În constructorul clasei IUG se adaugă la containerul de conținut al ferestrei principale (contentPane) butonul button, din clasa JButton. În acest scop, se folosește instrucțiunea
    getContentPane().add(buton);
  - În același constructor, se adaugă la buton ascultătorul de evenimente de fereastră af și ascultătorul de evenimente de acțiune ab. Obiectele indicate de referințele buton af și ab au fost construite înainte de a se construi interfața grafică.
  - Metoda actionPerformed(Event e) din clasa imbricată AB este invocată atunci când se produce un "eveniment de acțiune". Întrucat în programul nostru sursa evenimentelor de acțiune (la care a fost inregistrată instanța ab a clasei AB) este butonul buton, evenimentele de acțiune vor fi generate atunci când se apasă pe buton (se face click de mouse pe suprafața butonului). În această metodă se incrementează variabila contorAcționări și se pune în buton un nou text, care indică valoarea contorului. În acest scop se folosește instrucțiunea buton.setText(text).

Când punem în execuție această aplicație, pe ecran apare o fereastră cu titlul "Un buton de contorizare a apăsărilor", în interiorul căreia se găsește un buton pe care apare inscripția "Număr de acționări: 0". De fiecare dată, când facem click de mouse pe acest buton, constatăm că s-a modificat textul continut, indicand noua valoare a contorului de acționări.

Exemplul 2 Folosirea unei clase de buton de contorizare proprie, derivată din clasa JButton

Având în vedere ca butonul de contorizare a apăsărilor poate fi, în principiu, folosit și în mai multe aplicații, putem să îl declarăm ca o clasa publică într-un fișier separat, ca în fișierul ButonContor.java, reprodus aici:
 
/* Buton care contorizeaza numarul de apasari si afiseaza acest 
   numar pe suprafata sa, dupa numele butonului. In acest scop, 
   butonul isi asculta propriile evenimente de actiune.
*/

import java.awt.event.*;
import javax.swing.*;

public class ButonContor extends JButton implements ActionListener {
  private int contor; // contorul de apasari
  private String nume; // numele butonului

  public ButonContor(String nume) { // constructorul butonului
    contor=0;
    this.nume=nume+" #";
    setText(this.nume+contor);
    addActionListener(this); // butonul se asculta pe sine
  }

  public void actionPerformed(ActionEvent e) {
    contor++;
    setText(nume+contor);
  }

  public int numarApasari() { // se intoarce numarul de apasari
    return contor;
  }

  public void reset() { // se pune contorul la zero
    contor=0;
    setText(nume+contor);
  }
}

În fișierul AdComp1.java se dă o modificare a aplicației din exemplul precedent, în care, în locul unei instanțe a clasei JButton, se folosește o instanță a clasei ButonContor. În acest caz nu a mai fost necesar să se creeze o clasă de ascultare a butonului, întrucât butonul din clasa ButonContor se ascultă pe el însuși.
 
import java.awt.event.*;
import javax.swing.*;

class AdComp1 { 
 static AF af=new AF();
 static ButonContor buton=new ButonContor("Contor apasari");
 static IUG iug=new IUG("Un buton de contorizare a apasarilor");

 /* clasa imbricata pentru interfata utilizator grafica */
 static class IUG extends JFrame {

  IUG(String titlu) { // constructorul clasei IUG
   super(titlu);
   setSize(300, 80);
   setLocation(200, 150);
   getContentPane().add(buton); // adaugarea butonului
   addWindowListener(af);  // adaugarea ascultatorului de fereastra
   setVisible(true);
  }
 } 

 /* Clasa ascultatoare de fereastra */ 
 static class AF extends WindowAdapter {
  public void windowClosing(WindowEvent e) {
   System.exit(0); // incheierea executarii aplicatiei
  }
 }

 /* Metoda principala a aplicatiei */
 public static void main(String args[]) {
 }
}



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