Componentele din JFC/Swing

Pentru a realiza interfața utilizator grafică a unei aplicații folosind JFC/Swing, este necesar ca la fereastra aplicației (din clasa JFrame) să se adauge diferite obiecte grafice numite componente. Deosebim:

  1. Componente de control: butoane, butoane radio, casete de validare, liste, liste ascunse, meniuri, rigle ajustabile, câmpuri de text.

  2. Componente de afișare needitabile: etichete, indicatoare, etc.

  3. Componente de afișare editabile: zone de text, tabele editabile, selectoare de culori, selectoare de fișiere, arbori.

  4. Containere: panouri, panouri glisante, etc.
 
O prezentare a acestor componente însoțită de ilustrații sugestive și de descrierea detaliată a utilizării fiecăreia se găsește în lecția Using Swing Components din sectiunea Creating a GUI with JFC/Swing din Java Tutorial. Noi nu vom face aici, din lipsă de timp, decât o scurta prezentare a unor componente mai larg folosite și a modului lor de utilizare.

Majoritatea claselor de componente din JFC/Swing sunt derivate din clasa JComponent, moștenind caracteristicile acestei clase.

Clasa JComponent

Clasa abstracta javax.swing.JComponent extinde clasa java.awt.Container. In consecință, orice componenta Swing are și caracteristici de container.
 
Iată, ca exemplu, câteva facilități pe care le ofera orice JComponentă:
  - posibilitatea de a-i atașa componentei o "inscripție volanta" (engleză: ToolTip), adică o inscripție explicativă care apare când punem cursorul de mouse pe componenta respectivă, fără să apăsăm butonul. O astfel de inscripție se atașează componentei prin metoda
    public void setToolTipText(String text);
  - posibilitatea de a-i pune componentei o bordură, folosind metoda
    public void setBorder(Border border);
  - posibilitatea de a modifica culoarea de fond și culoarea de primplan ale componentei folosind metodele:
    public void setBackground(Color color);
    public void setForeground(Color color);

Mai multe metode sunt indicate în Indexul de clase.

O specificație mai detaliată a clasei JComponent este dată în indexul de clase.
Specificația completă a clasei JComponent este dată in documentația Java API, iar o descriere amplă a facilităților și modului de utilizare se găsește în capitolul The JComponent class din tutorialul Java.

Caracteristicile componentelor JFC/Swing

Fiecare componentă a interfeței utilizator grafice se caracterizează prin aspect, stare și comportament.

Aspectul este dat de figura prin care este reprezentată pe ecran componenta respectivă. Fiecare clasă de componente oferă un aspect tipic al instanțelor sale. În JFC/Swing programatorului i se pun însa la dispoziție metode și clase prin care poate modifica aspectul componentelor.

Starea componentei este dată, ca la orice obiect, de valorile câmpurilor sale. Starea se poate modifica fie datorită acțiunilor utilizatorului, fie datorită invocării prin program a unor metode ale acesteia. În general, la modificarea stării componenta generează un eveniment, iar uneori  își schimbă și aspectul.

Comportamentul componentei este modul în care aceasta reacționează atunci cînd se acționează asupra ei de către utilizator sau când este invocată o metodă și constă în modificarea stării și a aspectului și în generarea de evenimente.

Componentele din JFC/Swing oferă programatorului unele facilități importante privind stabilirea aspectului și comportamentului acestora. Iată unele ditre ele:
    - posibilitatea de a introduce în componentă un text, o imagine, sau ambele;
    - posibilitatea de a adăuga la fiecare componentă a unui text explicativ volant (engleză: Tool Tip), care conține indicații care apar când se pune cursorul mouse-ului pe componenta respectivă, fără a apăsa butonul de mouse.
    - posibilitatea de a pune în jurul componentei una sau mai multe borduri (engleză: Border), cu diferite aspecte: chenar simplu, chenar cu titlu, bordură care dă aspect de supraînălțare, bordură care dă aspect de scufundare;
    - posibilitatea de a alege aspectul general al tuturor componentelor interfeței grafice (engleză: Look and Feel).
 
Pentru a atașa componentei un text volant se folosește metoda clasei JComponent
    public void setToolTipText(String text);

Pentru a pune o bordură se folosește clasa javax.swing.BorderFactory care oferă metode pentru crearea unor borduri standard. Clasele de borduri și interfața Border se gasesc în pachetul javax.swing.border.

Adăugarea bordurii la componentă se face prin metoda clasei JComponent
    public void setBorder(Border border);
 
Iată unele din metodele clasei BorderFactory:
    public static Border createLineBorder(Color color) - creează o bordură (un chenar) dintr-o singură linie;
    public static Border createLineBorder(Color color, int thickness) - creează o bordură formată dintr-o linie de grosime (thickness) dată;
    public static Border createRaisedBevelBorder() - creeaza o bordură cu aspect de înălțare a componentei;
    public static Border createLoweredBevelBorder() - creeaza o bordura cu aspect de scufundare a componentei;
    public static Border createBevelBorder(int type, Color highlight, Color shadow) - creeaza o bordură pentru care se impun tipul și culorile, unde: 
  type - tipul bordurii, care poate fi BevelBorder.RAISED sau BevelBorder.LOWERED;
  highlight - culoarea marginii care creează aspectul de înălțare sau coborâre;
  shadow - culoarea umbrei.
    public static TitledBorder createTitledBorder(String title) - creeaza o bordură cu titlu.
    public static CompoundBorder createCompoundBorder(Border outsideBorder, Border insideBorder) - creeaza o bordură compusă, indicându-se bordura exterioară (outsideBorder) și cea interioara (insideBorder).

 
Exemplu
În fișierul TestComp.java este dat un exemplu de testare a posibilității de a stabili aspectul componentelor și a le atașa texte volante. Drept componente s-au folosit, deocamdată, instanțe ale clasei JButton, care a mai fost deja utilizată în capitolul precedent. Același mod de lucru poate fi însă folosit pentru orice alte clase care sunt derivate din JComponent.
 
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;

class TestComp { 
 static AF af=new AF();
 static IUG iug=new IUG("Butoane cu diferite aspecte");

 /* clasa imbricata pentru interfata utilizator grafica */
 static class IUG extends JFrame {
  //JLabel lab1, lab2, lab3, lab4;
  //JPanel panel;
  JButton b1,b2,b3,b4,b5,b6,b7;

  IUG(String titlu) { // constructorul clasei IUG
   super(titlu);
   setSize(300, 400);
   setLocation(200, 150);
   Container cp=getContentPane();
   addWindowListener(af);  // adaugarea ascultatorului de fereastra
   //panel=new JPanel();
   cp.setLayout(new GridLayout(7,1));
   //panel.setBackground(Color.red);
   b1=new JButton("Un buton obisnuit");
   //b1.setBackground(Color.blue);
   b2=new JButton("Un buton cu bordura liniara");
   b2.setBorder(BorderFactory.createLineBorder(Color.red, 4));
   b2.setToolTipText("Bordura este rosie cu grosimea 4");
   b3=new JButton("Un buton cu bordura cu titlu");
   b3.setBorder(BorderFactory.createTitledBorder("Un titlu"));
   b4=new JButton("Un buton ridicat");
   b4.setBorder(BorderFactory.createRaisedBevelBorder());
   b5=new JButton("Un buton coborat");
   b5.setBorder(BorderFactory.createLoweredBevelBorder());
   b6=new JButton(new ImageIcon("buton_go.gif"));
   b6.setBorder(BorderFactory.createTitledBorder(
      "Un buton cu titlu, care contine o imagine"));
   b7=new JButton("Un buton cu bordura compusa");
   Border bord1, bord2, bord3;
   bord1=BorderFactory.createBevelBorder(BevelBorder.RAISED,
      Color.green, Color.blue);
   bord2=BorderFactory.createBevelBorder(BevelBorder.LOWERED,
      Color.cyan, Color.yellow);
   bord3=BorderFactory.createCompoundBorder(bord1, bord2);
   b7.setBorder(bord3);
   cp.add(b1);
   cp.add(b2);
   cp.add(b3);
   cp.add(b4);
   cp.add(b5);
   cp.add(b6);
   cp.add(b7);
   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[]) {
 }
}

Remarcăm următoarele: 
  - pentru a lucra cu borduri, a fost necesar să se importe pachetul javax.swing.border;
  - s-au folosit bordurile standard din clasa BorderFactory;
  - butonului al doilea (b2, cel cu bordura roșie groasă) i s-a atașat un text explicativ volant; dacă punem cursorul de mouse deasupra acestui buton fără să apăsăm și așteptăm câteva secunde, apare textul volant;
  - în penultimul buton (b6) s-a introdus imaginea  care se găsește în fișierul buton_go.gif. Dacă doriți sa testati programul, această imagine trebuie să existe în același director cu clasa TestComp (deci în directorul curent al dvs). Pentru a realiza acest lucru, puneți cursorul mouse-ului pe această imagine, apasați butonul din dreapta și va apare un meniu din care selectați opțiunea "Save image as ..." sau "Save picture as ...", apoi salvați imaginea în același director cu fișierul TestComp.java.



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