Breviar 9

Interfețe grafice (GUI)

1. Introducere

1.1 Contextul interfețelor grafice

În cazul programelor pe care le-am făcut până acum, toate mesajele și răspunsurile apăreau ca linii de text sugestive, ecranul fiind folosit în mod text.

Un astfel de stil de comunicare nu este atractiv pentru utilizatori, motiv pentru care se preferă dialogul prin interfețe grafice sau GUI (Graphical User Interface), ecranul fiind folosit în mod grafic.

În trecerea de la o versiune la alta, bibliotecile de clase care oferă servicii grafice au suferit, probabil, cele mai mari schimbări. Acest lucru se datorează, pe de o parte, dificultății legate de implementarea noțiunii de portabilitate, iar pe de altă parte nevoii de a integra mecanismele GUI cu tehnologii apărute și dezvoltate ulterior.

1.2 Modalități de creare a interfețelor grafice

În momentul actual, există două modalități de a crea o aplicație cu interfață grafică:

  • AWT (Abstract Windowing Toolkit) - este API-ul inițial pus la dispoziție începând cu primele versiuni de Java;
  • Swing - este parte dintr-un proiect mai amplu numit JFC (Java Foundation Classes) creat în urma colaborării dintre Sun, Netscape și IBM, care se bazează pe modelul AWT, extinzând funcționalitatea acestuia și adăugând sau înlocuind unele componente pentru dezvoltarea aplicațiilor GUI.

Este preferabil ca aplicațiile Java să fie create folosind tehnologia Swing, deoarece aceasta pune la dispoziție o paletă mult mai largă de facilități, însă nu se va renunța complet la AWT, deoarece aici există clase esențiale, reutilizate în Swing.

2. Pachetul Swing

2.1 Caracteristici

Componentele Swing, spre deosebire de predecesoarele din versiunile Java anterioare, sunt implementate în întregime în Java. Aceasta are ca rezultat o mai bună compatibilitate cu platforme diferite decât în cazul folosirii componentelor AWT.

Unul din principalele deziderate ale tehnologiei Swing a fost să pună la dispoziție un set de componente GUI extensibile care să permită dezvoltarea rapidă de aplicații Java cu interfață grafică competitivă, din punct de vedere comercial.

Cel mai important pachet, care conține componentele de bază este javax.swing.

2.2 Elementele unei interfețe utilizator

Orice interfață utilizator Java este compusă din următoarele elemente:

  • Componente - orice poate fi plasat pe o interfață utilizator, cum ar fi butoane, liste de derulare, meniuri pop-up, casete de validare sau câmpuri de text;
  • Containere - acestea reprezintă componente care pot conține alte componente (de exemplu panouri, casete de dialog sau ferestre independente);
  • Administratori de dispunere - reprezintă obiecte care definesc modul în care sunt aranjate (dispuse) componentele într-un container. Administratorul de dispunere nu este vizibil într-o interfață, însă sunt vizibile rezultatele “muncii” sale.

Dispunerea componentelor interfeței este de mai multe feluri:

  • dispunere secvențială;
  • dispunere tabelară;
  • dispunere marginală;
  • dispunere tabelară neproporțională.

3. Crearea ferestrelor

3.1 Clasa JFrame

Clasa JFrame este cea pe care o vom folosi pentru a crea ferestre. Ca orice altă clasă care reprezintă componente Swing ea se află în pachetul javax.swing.

Pentru că este un container, vom folosi, de cele mai multe ori, această clasă prin moștenire nu prin instanțiere. Altfel spus, vom crea clase care să reprezinte ferestre și pentru ca acestea să devină ferestre de tip JFrame ele vor moșteni această clasă.

public class Fereastra extends JFrame {
    private JButton button;
 
    public Fereastra(String text) {
        super(text);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setMinimumSize(new Dimension(300, 200));
        getContentPane().setBackground(Color.blue);
        setLayout(new SpringLayout());
        button = new JButton("Apasa");
        add(button);
        pack();
        setVisible(true);
    }
 
    public static void main(String args[]) {
        Fereastra f = new Fereastra("Laborator POO");
    }
}

Metoda add(Component c) este folosită pentru a adăuga pe fereastră o componentă exact ca în cazul Applet-urilor. Metoda add() este moștenită din clasa Container.

4. Crearea butoanelor

4.1 Clasa JButton

Un buton poate fi creat folosind clasa JButton. De obicei, butonul este construit folosind unul dintre constructorii:

  • public JButton(); → un buton fără text
  • public JButton(String text) → un buton cu text dat ca parametru
  • public JButton(String text, Icon ico) → buton cu text și imagine

Textul de pe buton poate fi modificat folosind metoda setText(String text) sau poate fi preluat folosind metoda getText().

Metodele setLabel() și getLabel() sunt considerate obsolete și nu se mai folosesc în prezent.

4.2 Exemplu de implementare
class Button extends JFrame implements ActionListener {
    private JButton button;
 
    public Button(String text) {
        super(text);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setMinimumSize(new Dimension(300, 200));
        getContentPane().setBackground(Color.blue);
        setLayout(new SpringLayout());
        button = new JButton("Apasa");
        button.addActionListener(this);
        add(button);
        pack();
        setVisible(true);
    }
 
    public static void main(String args[]) {
        Button b = new Button("LaboratorPOO");
    }
 
    @Override
    public void actionPerformed(ActionEvent e) {
        /*
        JButton button = (JButton)e.getSource();
        if (button.getText().equals("Apasa"))
            // valabil dacă aveam mai multe butoane ascultate de acest ascultător
        */
        System.out.println("Butonul a fost apasat!");
    }
}

Din moment ce butonul reprezintă o componentă, poate fi adăugat pe un container folosind metoda add(Component c) a containerului.

Butonul JButton este sensibil la evenimente de tip ActionEvent, așadar, modalitatea de atașare a ascultătorilor și de creare evenimente este similară butoanelor Button din pachetul java.awt.

5. Crearea componentelor text

5.1 Tipuri de componente text

Vom folosi trei tipuri de componente text: JTextField, JTextArea și JPasswordField.

  • JTextField - este un câmp de text cu un singur rând pe care pot încăpea mai multe caractere. În general, această componentă este folosită pentru a introduce un text de dimensiuni mici;
  • JTextArea - este un câmp de text care permite introducerea unui text pe mai multe rânduri, deci, această componentă este folosită pentru texte de dimensiuni mai mari;
  • JPasswordField - este similară componentei JTextField, doar că aceasta ascunde caracterele introduse de utilizator ca în cazul unui câmp pentru introducerea parolei obișnuit.

Metoda folosită pentru preluarea textului dintr-o componentă text este: getText() care returnează o instanță de String.

Pentru a modifica textul dintr-un câmp de text, se folosește metoda setText(String text).

Componenta JTextArea are în comportament și metoda append(String text) care permite adăugarea unui text la componentă.

5.2 Exemplu de implementare
class Text extends JFrame implements ActionListener {
    private JButton button;
    private JTextField user;
    private JPasswordField pass;
 
    public Text(String text) {
        super(text);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setMinimumSize(new Dimension(300, 200));
        getContentPane().setBackground(Color.blue);
        setLayout(new FlowLayout());
        button = new JButton("Apasa");
        button.addActionListener(this);
        add(button);
        user = new JTextField(15);
        add(user);
        pass = new JPasswordField(15);
        add(pass);
        pack();
        setVisible(true);
    }
 
    public static void main(String args[]) {
        Text b = new Text("LaboratorPOO");
    }
 
    @Override
    public void actionPerformed(ActionEvent e) {
        /*
        JButton button = (JButton)e.getSource();
        if (button.getText().equals("Apasa"))
            // valabil dacă aveam mai multe butoane ascultate de acest ascultător
        */
        System.out.println(user.getText() + pass.getText());
    }
}

6. Butoane de selecție

6.1 JCheckBox și JRadioButton

Clasele JCheckBox și JRadioButton definesc componente de tip butoane de selecție.

Standard, butoanele JCheckBox sunt folosite pentru a crea liste de opțiuni de tip multiple-choice (din care poți selecta mai multe variante), iar JRadioButton pentru crearea de liste de tip single-choice (din care se poate selecta o singură opțiune).

Astfel, pentru butoanele JRadioButton adăugăm o nouă clasă ButtonGroup cu ajutorul căreia precizăm care sunt butoanele din care se selectează o singură opțiune.

ButtonGroup definește un grup de butoane. Din butoanele ce aparțin aceluiași grup, nu putem selecta decât o singură opțiune.

6.2 Utilizare

Ambele tipuri de componente se creează similar butoanelor JButton. În general, acestea nu sunt folosite cu evenimente și prin verificări ale stărilor acestora (se verifică dacă este sau nu selectat la un anumit eveniment).

Verificarea stării unei astfel de componente se face folosind metoda isSelected() care returnează true dacă butonul este bifat și false dacă nu este bifat.

Pentru o înțelegere mai bună, se recomandă analizarea exemplelor propuse în arhiva laboratorului.

7. JScrollPane

7.1 Descriere

JScrollPane este o componentă folosită pentru adăugarea de bare de defilare pentru o altă componentă care ar putea depăși dimensiunile containerului în care este adăugată.

Instanța JScrollPane nu este folosită în acțiunile directe pe care le are componenta pe care o susține. La construirea instanței, i se dă o componentă pentru care este creată și pe care adaugă bare de defilare (scrollbars).

Apoi, instanța JScrollPane este adăugată pe container în locul componentei din instanța JScrollPane.

7.2 Exemplu de implementare
class Text extends JFrame {
    private JTextArea textArea;
    private JScrollPane scroll;
 
    public Text(String text) {
        super(text);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setMinimumSize(new Dimension(300, 200));
        getContentPane().setBackground(Color.blue);
        setLayout(new FlowLayout());
        textArea = new JTextArea(200, 100);
        textArea.setLineWrap(true);
        textArea.setWrapStyleWord(true);
        textArea.setFont(new Font("Tahoma", 2, 12));
        scroll = new JScrollPane(textArea);
        add(scroll);
        pack();
        setVisible(true);
    }
 
    public static void main(String args[]) {
        Text b = new Text("LaboratorPOO");
    }
}

8. Etichete

8.1 JLabel

O etichetă reprezintă cea mai simplă componentă. Aceasta este folosită pentru afișarea unui text static în cele mai multe cazuri.

Textul de pe o etichetă poate fi modificat sau preluat folosind metodele getText() și setText(String text).

Un JLabel poate fi uzitat și pentru afișarea unei imagini. În acest caz, nu i se aplică niciun text, ci doar un ImageIcon, această modalitate fiind considerată cea mai simplă de a afișa o imagine într-un container.

9. Tratarea evenimentelor

9.1 Ce sunt evenimentele?

Un eveniment este produs de o acțiune a utilizatorului asupra unei componente grafice și reprezintă mecanismul prin care utilizatorul comunică efectiv cu programul.

Exemple de evenimente sunt:

  • apăsarea unui buton;
  • modificarea textului într-un control de editare;
  • închiderea sau redimensionarea unei ferestre.

Componentele care generează anumite evenimente se mai numesc și surse de evenimente.

9.2 Listeners (Ascultători de evenimente)

Interceptarea evenimentelor generate de componentele unui program se realizează prin intermediul unor clase de tip listener (ascultător, consumator de evenimente).

În Java, orice obiect poate “consuma” evenimente, cu condiția ca acesta să implementeze interfața listener corespunzătoare tipului de eveniment pe care dorește să-l intercepteze.

poo/breviare/breviar-09.txt · Last modified: 2025/12/01 13:01 by carmen.odubasteanu
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0