Utilizarea ferestrelor de dialog

Ferestrele de dialog sunt ferestre care se afișează pe ecran numai temporar, pentru a transmite anumite mesaje sau a permite introducerea unor date. Principalul avantaj al folosirii ferestrelor de dialog este că apar pe ecran numai atunci când sunt necesare și nu încarcă fereastra principală a aplicației cu elemente care nu sunt necesare în permanență.
 
În JFC/Swing, ferestrele de dialog se realizează folosind clasa javax.swing.JDialog. Instanțele acestei clase se comportă asemanator cu cele ale clasei JFrame, permițând adăugarea oricăror componente. La fel ca la JFrame, aceste componente nu se adaugă direct la fereastră, ci la panoul contentPane conținut în aceasta și obținut prin metoda public Container getContentPane()

Fereastra de dialog poate avea ca "proprietar" (owner) o instanță a claselor java.awt.Frame, javax.swing.JFrame, java.awt.Dialog sau javax.swing.JDialog. Proprietarul se transmite ca argument al constructorului ferestrei de dialog. Se permite ca, în loc de proprietar, să se pună argumentul null, în care caz se atribuie un proprietar implicit.

Pentru afișarea pe ecran a ferestrei de dialog se invocă metoda public void show(), iar pentru ascunderea ei se invocă metoda public void hide(). În fine, pentru a elimina fereastra de dialog, eliberând toate resursele pe care le folosește, se invocă metoda public void dispose(). Aceste trei metode sunt moștenite de JDialog de la superclasa java.awt.Dialog. Când fereastra de dialog este deschisă, ea trece în prim plan sau în plan secund împreună cu proprietarul ei. 

Ferestrele de dialog pot fi modale sau nemodale. Când este afișată pe ecran o fereastră modală, toate celelalte ferestre existente pe ecran sunt blocate (nu se poate acționa asupra lor), până când se încheie lucrul cu fereastra de dialog modală respectivă.

Clasele Dialog și JDialog sunt prezentate ceva mai detaliat în indexul de clase.

Clasa JDialog este folosită pentru realizarea unor ferestre de dialog configurate de programator după dorința sa. În multe situații, este însă suficient să se folosească ferestre de dialog standard, preconfigurate, ceeace ușurează programarea. În acest scop, în JFC/Swing a fost creată clasa javax.swing.JOptionPane care este prezentată în indexul de clase.
 
Clasa JOptionPane oferă metode statice pentru a crea patru tipuri de ferestre de dialog: 
  - pentru dialog de mesaj (showMessageDialog) - fereastra conține o informație și un buton OK care se apasă pentru a închide fereastra;
  - pentru dialog de confirmare (showConfirmDialog) - în fereastra se afișează un mesaj (o întrebare) și trei butoane de confirmare: Yes/No/Cancel; la apăsarea unuia dintre ele, metoda întoarce valoarea corespunzatoare și fereastra de dialog dispare;
  - pentru dialog de intrare (showInputDialog) - fereastra conține un mesaj, un câmp de text și două butoane: OK și Cancel. Utilizatorul introduce în câmpul de text o valoare (un șir de caractere sau un număr) și apasa tasta <Enter> sau actioneaza cu mouse-ul butonul OK. În ambele cazuri fereastra de dialog dispare, iar metoda întoarce șirul introdus în câmpul de text. Dacă se apasă butonul Cancel, fereastra de dialog dispare, iar metoda întoarce null.
  - pentru dialog de opțiune (showOptionDialog), care întrunește caracteristicile celor trei tipuri de mai sus.

  Pentru fiecare din aceste patru tipuri de ferestre de dialog există mai multe metode cu numele corespunzător, care diferă între ele prin lista de argumente. Pentru detalii trimitem la documentația Java API.


 
Exemplu
În fișierul Dialog1.java este dat un exemplu de aplicație, în care se testează diferitele tipuri de ferestre de dialog create cu metodele statice ale clasei javax.swing.JOptionPane. Fereastra principală a aplicației conține un buton cu inscripția "Introducere text" și o arie de text (JTextArea). Când este acționat butonul, apare o fereastră de dialog de intrare, cu mesajul "Introduceți un text". Dacă se acționeaza butonul OK fără să fi introdus nimic în câmpul de text, apare o noua fereastră de dialog, care conține mesajul de avertisment "Nu se permite un șir vid". Dacă se introduce un șir în câmpul de text și se acționeaza butonul OK sau tasta Enter, apare o nouă fereastră de dialog, care cere confirmarea că acest text trebuie introdus în aria de text. Dacă se răspunde prin acționarea butonului Yes, se face adăugarea, iar dacă se răspunde prin apăsarea butonului No sau Cancel, fereastra de dialog dispare fără să se facă adăugarea textului.

Întrucât întregul dialog este declanșat, în cazul de față, prin acționarea butonului "Introducere text", programul prin care se realizează dialogul a fost plasat în metoda actionPerformed a clasei IntroducereText care ascultă evenimentele de acțiune generate de butonul menționat.
 
/* Alegerea culorilor folosind obiectele de culoare predefinite
   din clasa Color
*/

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

class Dialog1 { 
 static AF af=new AF();
 static IntroducereText it=new IntroducereText();
 static IUG iug=new IUG("Utilizarea unei ferestre de dialog");

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

  IUG(String titlu) { // constructorul clasei IUG
   super(titlu);
   setSize(250, 200);
   setLocation(100, 50);
   Container cp=getContentPane();
   addWindowListener(af);  // adaugarea ascultatorului de fereastra
   JButton buton1=new JButton("Introducere text");
   buton1.addActionListener(it);
   cp.add(buton1, BorderLayout.NORTH);
   arieText=new JTextArea();
   arieText.setLineWrap(true);
   arieText.setWrapStyleWord(true);
   cp.add(arieText, BorderLayout.CENTER); 
   setVisible(true);
  }

 } 

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

 /* Clasa pentru introducerea textului prin fereastra de dialog */
 static class IntroducereText implements ActionListener {
  public void actionPerformed(ActionEvent e) {
   String sirIntrodus;
   boolean terminat=false;
   while(!terminat) {
    sirIntrodus=JOptionPane.showInputDialog("Introduceti un text");
    if(sirIntrodus!=null) { 
     if(sirIntrodus.trim().equals(""))
      JOptionPane.showMessageDialog(iug, "Nu se permite un sir vid!",
       "Avertisment", JOptionPane.WARNING_MESSAGE);
     else { 
      int raspuns=JOptionPane.showConfirmDialog(iug,
        "Doriti adaugarea textului: "+sirIntrodus+"?");
      if(raspuns==JOptionPane.YES_OPTION) 
        iug.arieText.append(sirIntrodus+"\n");
      terminat=true;
     }
    }
    else terminat=true;
   }
  }
 }

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

Cu privire la metoda actionPerformed din clasa IntroducereText remarcăm următoarele:
  1) Instrucțiunea 
sirIntrodus=JOptionPane.showInputDialog("Introduceti un text");
are ca efect afișarea pe ecran a unei ferestre de dialog de intrare. Șirul introdus în câmpul de text al acestei ferestre este intors și atribuit variabilei sirIntrodus. Dacă s-a acționat butonul Cancel, metoda întoarce null.
  2) Instrucțiunea
  JOptionPane.showMessageDialog(null, "Nu se permite un sir vid!","Avertisment", JOptionPane.WARNING_MESSAGE);
are ca efect afișarea unei ferestre de dialog care conține un mesaj de avertisment.
  3) Instrucțiunea
 int raspuns=JOptionPane.showConfirmDialog(iug,
        "Doriti adaugarea textului: "+sirIntrodus+"?");
are ca efect afișarea unei ferestre de dialog de confirmare, care întoarce o valoare de tip int, care poate fi egală cu una din cosnstantele YES_OPTION, NO_OPTION sau CANCEL_OPTION care sunt definite în clasa JOptionPane.

În rest, considerăm că procedura de dialog rezultă clar din textul metodei.

Pentru aprofundarea utilizării ferestrelor de dialog, recomandăm consultarea capitolului How to Make Dialogs din Java Tutorial.



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