Butonul obișnuit (cu o singură stare stabilă)

Butoanele obișnuite se realizează folosind clasa javax.swing.JButton, derivată din clasa javax.swing.AbstractButton, așa cum am arătat în exemplele date în capitolul precedent. Butonul obișnuit are o singură stare stabilă, în care ajunge când este eliberat. Cât timp se ține butonul de mouse apăsat deasupra lui, butonul se află în starea "apăsat" ("acționat"). De fiecare dată când este acționat, butonul generează un AcționEvent și un ChangeEvent. Când este eliberat, generează numai un ChangeEvent. Butonul generează de asemenea, ca orice altă componentă, evenimente de componentă, de mouse și de tastă. Totuși, în cazul butoanelor obișnuite, cel mai frecvent se folosesc evenimentele de acțiune (ActionEvent), care sunt ascultate de un ascultător de acțiune (ActionListener). Clasele Button și JButton sunt specificate mai detaliat în Indexul de clase.

Butonul cu două stări stabile

Clasa javax.swing.JToggleButton este derivata din javax.swing.AbstractButton și reprezintă butoane cu două stări stabile. Trecerea de la o stare la alta este impusă de utilizator prin click de mouse sau este comandată prin program. În practică, cel mai frecvent se folosesc caseta de validare și butonul radio, realizate prin subclase ale clasei ToggleButton și prezentate în continuare. O specificare mai detaliată a clasei JToggleButton este dată în indexul de clase.

Caseta de validare

Caseta de validare este un obiect de control cu două stări stabile. La fiecare click de mouse pe suprafata casetei de validare, aceasta trece dintr-o stare în cealaltă. În mod obișnuit, caseta de validare este reprezentată grafic printr-un patrat, în care apare un simbol de bifare (de validare), cum ar fi simbolul V sau X, când caseta se găsește în starea "selectat". În starea opusă (deselectat), caseta este vidă. Imaginea casetei este insoțită și de un text explicativ.
 
În unele sisteme de interfață grafică, în locul casetei de validare se foloseste un comutator ("switch"). Acesta are aspectul unui buton, la care ambele stări ("apăsat" și "eliberat") sunt stabile, trecerea de la o stare la alta făcându-se la fiecare click de mouse pe suprafața butonului. Din punct de vedere funcțional, astfel de comutatoare se comporta identic cu casetele de validare, diferența fiind numai în aspectul grafic. 

În JFC/Swing casetele de validare se realizează folosind clasa javax.swing.JCheckBox, care este derivată din clasa javax.swing.JToggleButton.
 
Dintre evenimentele generate de caseta de validare, cel mai important este java.awt.event.ItemEvent, care este ascultat de clase cu interfața java.awt.event.ItemListener. Astfel de evenimente sunt generate în momentele în care caseta a fost selectată sau deselectată. Metoda prin care se captează astfel de evenimente într-un ItemListener este
    public void itemStateChanged(ItemEvent e)

Pentru a afla în ce stare se gasește caseta la un moment dat, se folosește metoda
    public boolean isSelected()
din superclasa javax.swing.AbstractButton.

Butonul radio

Butonul radio este un buton cu două stări stabile, care face parte dintr-un grup de butoane, astfel că la un moment dat numai unul dintre ele poate fi "selectat". În momentul în care este selectat ("apăsat") un buton al grupului, se deselectează automat cel care era selectat anterior.

În JFC/Swing, butoanele radio sunt realizate ca instanțe ale clasei javax.swing.JRadioButton,  care este derivată din clasa javax.swing.JToggleButton. Gruparea butoanelor se face folosind clasa javax.swing.ButtonGroup.
 
Exemplu
În fișierul TestButoane.java se dă un exemplu de aplicație, în care se testează butoanul simplu, caseta de validare și butonul radio. 
 
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
 

class TestButoane { 
 static AF af=new AF();
 static Ascultator ascult=new Ascultator();
 static IUG iug=new IUG("Diferite tipuri de butoane");

 /* clasa imbricata pentru interfata utilizator grafica */
 static class IUG extends JFrame {
  JButton b1,b2;
  JCheckBox cb1, cb2;
  JRadioButton rb1, rb2, rb3;
  ButtonGroup grup;
  Box box1, box2, box3, box4;
  JLabel label;

  IUG(String titlu) { // constructorul clasei IUG
   super(titlu);
   setSize(300, 150);
   setLocation(200, 50);
   Container cp=getContentPane();
   addWindowListener(af);  // adaugarea ascultatorului de fereastra
   /* Se creeaza doua butoane, b1 si b2, care se pun in caseta box1 */
   b1=new JButton("B1 (F1)");
   b1.addActionListener(ascult);
   b1.setMnemonic(KeyEvent.VK_F1);
   b2=new JButton("B2 (F2)");
   b2.addActionListener(ascult);
   b2.setMnemonic(KeyEvent.VK_F2);
   box1=Box.createVerticalBox();
   box1.add(new JLabel("Butoane simple"));
   box1.add(b1);
   box1.add(b2);
   /* Se creeaza doua casete de validare, care se pun in box2 */
   cb1=new JCheckBox("Caseta 1 (A)");
   cb1.addItemListener(ascult);
   cb1.setMnemonic(KeyEvent.VK_A);
   cb2=new JCheckBox("Caseta 2 (S)");
   cb2.addItemListener(ascult);
   cb2.setMnemonic(KeyEvent.VK_S);
   box2=Box.createVerticalBox();
   box2.add(new JLabel("Casete validare"));
   box2.add(cb1);
   box2.add(cb2);
   /* Se creeaza trei butoane radio, care se grupeaza si se
      pun in box3 
   */
   rb1=new JRadioButton("BR 1 (F5)");
   rb1.setMnemonic(KeyEvent.VK_F5);
   rb1.addActionListener(ascult);
   rb2=new JRadioButton("BR 2 (F6)");
   rb2.setMnemonic(KeyEvent.VK_F6);
   rb2.addActionListener(ascult);
   rb3=new JRadioButton("BR 3 (F7)");
   rb3.setMnemonic(KeyEvent.VK_F7);
   rb3.addActionListener(ascult);
   box3=Box.createVerticalBox();
   box3.add(new JLabel("Butoane radio"));
   box3.add(rb1);
   box3.add(rb2);
   box3.add(rb3);
   grup=new ButtonGroup();
   grup.add(rb1);
   grup.add(rb2);
   grup.add(rb3);
   /* box1, box2 si box3 se pun in box4 , iar aceasta 
      se pune in controlPane
   */
   box4=Box.createHorizontalBox();
   box4.add(Box.createHorizontalGlue());
   box4.add(box1);
   box4.add(Box.createHorizontalStrut(15));
   box4.add(box2);
   box4.add(Box.createHorizontalStrut(15));
   box4.add(box3);
   box4.add(Box.createHorizontalGlue());
   cp.add(box4, BorderLayout.CENTER);
   label=new JLabel("Actionati butoanele si urmariti mesajul");
   cp.add(label, BorderLayout.SOUTH);
   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 si de selectari */
 static class Ascultator implements ActionListener, ItemListener {
  public void actionPerformed(ActionEvent e) {
    iug.label.setText("A fost apasat butonul "+e.getActionCommand());
  }
  public void itemStateChanged(ItemEvent e) {
    JCheckBox cb=(JCheckBox)e.getItem();
    String selectie;
    if(cb.isSelected()) selectie="A fost selectata ";
    else selectie="A fost deselectata ";
    iug.label.setText(selectie+cb.getText());
  }
 }

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

În fereastra principală a aplicației apar:
  - două butoane simple din clasa JButton, cu textele B1 și B2; butoanele sunt referite prin b1 și b2 și sunt puse în caseta verticală box1;
  - două casete de validare din clasa JCheckBox, cu textele Caseta 1 și Caseta 2, referite prin cb1 și cb2 și puse în caseta verticală box2;
  - trei butoane radio din clasa JRadioButton, cu textele BR1, BR2 și BR3, referite prin br1, br2 și br3 si puse în caseta verticală box3;
  - cele trei casete verticale, box1, box2 și box3, sunt plasate în caseta orizontală box4, iar aceasta este pusă în zona CENTER a panoului controlPane;
  - în zona SOUTH a controlPane este pusă o etichetă din clasa JLabel, folosită pentru a afișa evenimentele.

Ascultarea evenimentelor de acțiune (ActionEvent) și de selecție (ItemEvent) se face cu clasa Ascultare, care implementează interfețele ActionListener și ItemListener. 

Detectarea butonului care a fost apăsat, fie că este vorba de un buton simplu sau unul radio, se face în metoda actionPerformed(ActionEvent action) folosind metoda String getActionCommand() din clasa ActionEvent. Pentru a constata care caseta de validare care a fost selectată sau deselectată, în metoda itemStateChanged(ItemEvent item) se procedează astfel: se determină mai întâi obiectul selectabil (în cazul nostru caseta de validare) care a generat evenimentul, folosind metoda Object getItem() din clasa ItemEvent, după care se aplică metoda boolean isSelected() a acestui obiect.

Fiecărui buton (sau casetă de validare) i-a fost atașată o mnemonică. Pentru comoditatea utilizatorului, tasta corespunzătoare a fost menționată între paranteze, în textul fiecărui buton. Dacă se dă comanda Alt-<Tastă mnemonică> se obține același efect ca atunci când se face click de mouse pe butonul respectiv. De exemplu, în loc de a apăsa cu mouse-ul butonul B2, se apasă simultan tastele Alt și F2. Simbolurile tastelor se găsesc în clasa java.awt.event.KeyEvent.

Pentru aprofundarea folosirii diferitelor tipuri de butoane, recomandăm capitolul How to use Buttons, Check Boxes and Radio Buttons din Java Tutorial.



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