Scrigroup - Documente si articole

     

HomeDocumenteUploadResurseAlte limbi doc
AccessAdobe photoshopAlgoritmiAutocadBaze de dateCC sharp
CalculatoareCorel drawDot netExcelFox proFrontpageHardware
HtmlInternetJavaLinuxMatlabMs dosPascal
PhpPower pointRetele calculatoareSqlTutorialsWebdesignWindows
WordXml


Interfete grafice - aplicatii Swing

java



+ Font mai mare | - Font mai mic



Interfete grafice

1.1.   Ce este o interfata grafica?

Interfata grafica se refera la toate tipurile de comunicare vizuala intre un program si utilizatorii sai. Interfata grafica se refera nu numai la ceea ce utilizatorul vede pe ecran ci si la toate mecanismele de comunicare intre acesta si program.



Limbajul Java pune la dispozitie numeroase clase pentru implementarea diferitelor functionalitati ale interfatei grafice, insa ne vom ocupa in continuare de acelea care permit realizarea unei intefete grafice cu utilizatorul (GUI - Graphical User Interface).

In principiu, crearea unei aplicatii grafice presupune urmatorii pasi:

1.      crearea unei suprafete de afisare (cum ar fi o fereastra) pe care vor fi asezate obiectele grafice care servesc la comunicarea cu utilizatorul (butoane, controale de editare, texte, etc);

2.      crearea si asezarea obiectelor grafice pe suprafata de afisare in pozitiile corespunzatoare;

3.      definirea unor actiuni care trebuie sa se execute in momentul cand utilizatorul interactioneaza cu obiectele grafice ale aplicatiei;

4.      'ascultarea' evenimentelor generate de obiecte in momentul interactiunii cu utilizatorul si executarea actiunilor corespunzatoare asa cum au fost ele definite.

In Java exista doua pachete de clase care ofera servicii grafice: java.awt si javax.swing. In acest curs ne vom ocupa de pachetul Swing care este o extensie a pachetului awt. 'Swing' a fost numele de cod dat proiectului care dezvolta componente noi. Incepand cu javax.swing este numele pachetelor pentru Swing API.

Majoritatea obiectelor grafice sunt subclase ale clasei JComponent, clasa care defineste generic o componenta grafica care poate interactiona cu utilizatorul.
Asadar, printr-o componenta grafica vom intelege orice obiect care are o reprezentare grafica ce poate fi afisata pe ecran si care poate interactiona cu utilizatorul. Exemple de componente sunt ferestrele, butoanele, bare de defilare, etc. In general, toate componentele sunt definte de clase proprii ce se gasesc in pachetul
javax.swing, clasa JComponent fiind superclasa abstracta a tuturor acestor clase.

Crearea obiectelor grafice nu realizeaza automat si afisarea lor pe ecran. Mai intai ele trebuie asezate pe o suprafata de afisare, care poate fi o fereastra sau suprafata unui applet, si vor deveni vizibile in momentul in care suprafata pe care sunt afisate va fi vizibila. O astfel de suprafata pe care se aseaza obiectele grafice reprezinta o instanta a unei clase obtinuta prin extensia clasei Container; din acest motiv suprafetele de afisare vor mai fi numite si containere. Clasa Container este o subclasa aparte a clasei Component, fiind la randul ei superclasa tuturor suprafetelor de afisare Java (ferestre, applet-uri, etc).

Pachetul Swing ofera programelor care folosesc componentele lui posibilitatea sa-si aleaga natura interfetei ("look and feel") sau, pur si simplu, sa o conserve pe cea caracteristica platformei respective.

1.2.   Primele aplicatii Swing

1.2.1.  Exemple

Exemplu 1: O aplicatie de sine statatoare, care nu utilizeaza applet-ul.

1.             import javax.swing.*;

2.             import java.awt.*;

3.             import java.awt.event.*;

4.             public class SwingTest

16.         });

17.         JPanel panou = new JPanel();

18.         panou.setBorder(BorderFactory.createEmptyBorder( 30,30,10,30));

19.         panou.setLayout(new FlowLayout());

20.         panou.add(buton);

21.         panou.add(eticheta);

22.         return panou;

23.         }//creazaComponente

24.        

25.         public static void main(String[] args) catch (Exception e)

29.         JFrame frame = new JFrame('Prima aplicatie Swing');

30.         SwingTest app = new SwingTest();

31.         Component comp = app.creazaComponente();

32.         frame.getContentPane().add(comp);

33.         frame.addWindowListener(new WindowAdapter()

});

34.         frame.pack();

35.         frame.setVisible(true);

36.         }//main

37.         }//class

In linia 17 se creaza un panel (panou) pe care vor fi asezate componentele.

In linia 18 se seteaza marginea panel-ului cu dimensiunile pentru (sus, stanga, jos, dreapta).

In linia 29 se creaza container-ul principal (din varful ierarhiei) si in linia 32 se adauga componentele pe el.

In liniile 33-35 se incheie setarile pentru frame si se afiseaza.

Exemplu 2: O aplicatie care utilizeaza applet-ul.

1.             import javax.swing.*;

2.             import java.awt.*;

3.             public class SwingAppletTest extends JApplet

10.         }

1.2.2.  Comentarea exemplelor

1.2.2.1                   Alegerea naturii interfetei

In codul urmator se specifica natura interfetei:

try catch (Exception e)

1.2.2.2                   Setarea container-ului principal (din varful ierarhiei)

Orice program care prezinta o GUI Swing contine cel putin un container Swing. In general, container-ele principale sunt instante ale lui JFrame, JDialog sau (pentru appleturi) JApplet. Fiecare obiect JFrame implementeaza o singura fereastra principala, fiecare obiect JDialog cate o fereastra secundara si fiecare obiect JApplet implementeaza un applet in cadrul unui browser. Container-ul principal Swing furnizeaza suportul necesar componentelor Swing pentru a fi afisate si pentru a manipula evenimentele. In exemplu 1 container-ul folosit este JFrame si este creat in linia 29. In exemplu 2 container-ul folosit este JApplet (vezi linia 3).

Aplicatiile Swing grupeaza etichetele si butoanele intr-un container (un JPanel) inainte sa le adauge pe frame. Adaugarea componentelor pe panel inseamna ca ele vor fi controlate de manager-ul de layout al panel-ului. Manager-ul de layout al unui container determina dimensiunea si pozitia fiecarei componente care este adaugata pe container.

1.2.2.3                   Manipularea evenimentelor

Aplicatia din exemplu 1 contine doua evenimente tratate. Una trateaza click-ul pe buton (action events); cealalta trateaza inchiderea ferestrei (window events):

button.addActionListener(new ActionListener()

});

frame.addWindowListener(new WindowAdapter()

});

1.3.   Containere principale

Dupa cum am vazut, suprafetele de afisare ale componentelor grafice (containerele) sunt extensii ale clasei Container.

Spre deosebire de un applet care isi poate plasa componentele direct pe suprafata de afisare a browser-ului in care ruleaza, o aplicatie independenta are nevoie de propriile ferestre pe care sa faca afisarea componentelor sale grafice. O astfel de suprafata pe care se aseaza obiectele grafice se numeste suprafata de afisare sau container si reprezinta o instanta a unei clase obtinuta prin extensia superclasei Container.

Cele mai importante containere principale sunt: JFrame, JDialog, JWindow si JApplet. Ierarhia de clase este:

java.awt.Container

|__ java.awt.Panel

|__ java.applet.Applet

|__ javax.swing.JApplet

|__ java.awt.Window

|__ java.awt.Frame

| |__ javax.swing.JFrame

|__ java.awt.Dialog

| |__ javax.swing.JDialog

|__ javax.swing.JWindow

1.3.1.  Clasa JFrame

Clasa JFrame este folosita pentru implementarea ferestrelor principale. Aceasta componenta are caracteristic cadrul, bara de titlu si controalele ferestrei furnizate de sistemul de operare. Acestea nu pot fi modificate. Comportamentul ferestrelor (redimensionare, minimizare, pozitionare) este controlat de sistemul de operare.

Constructorii clasei JFrame sunt:

JFrame() - construieste o fereastra, fara titlu, initial invizibila.

JFrame(String title) - construieste o fereastra, cu titlu specificat, initial invizibila.

Asadar, o fereastra nou creata este invizibila. Pentru a fi facuta vizibila se va apela metoda show().

Exemplu 3: Se construieste si se afiseaza o fereastra cu titlul 'Prima fereastra'.

import javax.swing.*;

public class AplJFrame

}

Cateva dintre metodele cele mai folosite ale clasei JFrame sunt prezentate in continuare.

Metoda pack() este folosita pentru a da o dimensiune frame-ului. O alternativa pentru pack() este setarea explicita a dimensiunii frame-ului prin apelarea metodei setSize(). In general, folosirea lui pack() este preferabila folosirii lui setSize(), deoarece pack() lasa in seama layout manager-ului calculul dimensiunii frame-ului care tine seama si de alti factori care pot afecta dimensiunea componentelor.

Metoda setVisible() este folosita pentru a afisarea frame-ului.

Metoda getContentPane() returneaza obiectul contentPane al frame-ului. Orice componenta se adauga pe contentPane-ul frame-ului curent.

Exemplu 4:

import javax.swing.*;

import java.awt.*;

import java.awt.event.*;

public class AplicFrame catch (Exception e)

/*Se creaza container-ul principal (din varful ierarhiei) si se adauga componentele pe el*/

JFrame frame = new JFrame();

JLabel comp = new JLabel('eticheta1');

JLabel comp1 = new JLabel('eticheta2');

//eticheta2 va fi pusa peste eticheta1

frame.getContentPane().add(comp);

frame.getContentPane().add(comp1);

frame.addWindowListener(new WindowAdapter()

});

frame.pack();

frame.setVisible(true);

}

}

1.3.2.  Ferestre secundare si clasa JDialog

Pentru a crea ferestre secundare se foloseste, de obicei, JDialog. Alte ferestre secundare pot fi create cu:

JOptionPane - creeaza o fereastra standard de dialog

ProgressMonitor - creeaza o fereastra care arata progresul unei operatii

JColorChooser - creeaza o fereastra pentru alegerea culorii

JFileChooser - creeaza o fereastra pentru selectarea unui fisier

Exemplu 5:

import javax.swing.*;

import java.awt.*;

import java.awt.event.*;

public class AplicJOptionPane catch (Exception e)

JFrame frame = new JFrame();

JButton b=new JButton('Apasa-ma');

frame.getContentPane().add(b);

b.addActionListener(new ActionListener()

});

frame.addWindowListener(new WindowAdapter()

});

frame.pack();

frame.setVisible(true);

}

}

Fiecare fereastra secundara este dependenta de una principala (de un frame).

O fereastra de dialog poate fi modala. Daca este modala, ea blocheaza accesul la oricare alta fereastra din program.

Cele mai simple ferestre modale pot fi create folosind una din metodele:

         JOptionPane.showMessageDialog - fereastra modala inzestrata cu un buton. Se poate specifica mesajul, icoana si titlul ferestrei .

         JOptionPane.showOptionDialog - fereastra modala inzestrata cu butoane, mesaj, icoana si titlul ferestrei. Pot fi modificate de utilizator.

Exemplu 6:

Object[] options = ;

int n=JOptionPane.showOptionDialog(

new Frame(),

'Ma parasesti?',

'Fereastra de Optiuni',

JOptionPane.YES_NO_CANCEL_OPTION,

JOptionPane.QUESTION_MESSAGE,

null,

options,

options[2]);

                    JOptionPane.showConfirmDialog - fereastra modala inzestrata cu doua butoane.

Exemplu 7:

JOptionPane.showConfirmDialog(

null,

'Alege un buton',

'Fereastra de confirmare',

JOptionPane.YES_NO_OPTION);

Parametrii folositi de aceste metode:

      parentComponent: poate fi frame-ul care contine fereastra de dialog (ea este afisata pornind de la coordonatele ferestrei parinte) sau null (se foloseste un frame implicit si fereastra de dialog este centrata pe ecran);

      message: mesajul care apare in fereastra de dialog;

      messageType: defineste stilul mesajului. Valori posibile sunt:

-        ERROR_MESSAGE

-        INFORMATION_MESSAGE

-        WARNING_MESSAGE

-        QUESTION_MESSAGE

-        PLAIN_MESSAGE

      optionType: defineste multimea de butoane care apar pe fereastra:

-        DEFAULT_OPTION

-        YES_NO_OPTION

-        YES_NO_CANCEL_OPTION

-        OK_CANCEL_OPTION

Pot fi folosite si alte tipuri de butoane;

      options: descriere detaliata a multimii butoanelor afisate pe fereastra; in general, este un vector de String-uri;

      icon: icoana afisata pe fereastra;

      title: titlul ferestrei;

      initialValue: butonul selectat implicit.

Metodele showMessageDialog, showConfirmDialog si showOptionDialog returneaza un intreg semnificand optiunea utilizatorului. Valorile acestui intreg pot fi YES_OPTION, NO_OPTION, CANCEL_OPTION, OK_OPTION si CLOSED_OPTION.

Ferestre de dialog nemodale se pot crea cu JDialog.

JDialog este folosita pentru implementarea ferestrelor secundare (cum ar fi dialog boxes si alert boxes) si a celor utilitare. Aceasta componenta are caracteristic cadrul si bara de titlu furnizate de sistemul de operare. Aduce nou fata de clasa Dialog suportul pentru operatia de inchidere implicita.

Exemplu 8:

import javax.swing.*;

import java.awt.event.*;

import java.awt.*;

public class Dialog

}

});

frame.addWindowListener(new WindowAdapter()

});

frame.pack();

frame.setVisible(true);

}

}

1.3.3.  Clasa JWindow

Clasa JWindow este folosita pentru implementarea ferestrelor pline (dreptunghiuri albe pline). Aceste ferestre nu contin bara de titlu sau controale de fereastra.

Exemplu 9:

import javax.swing.*;

import java.awt.*;

import java.awt.event.*;

public class AplicJWindow catch (Exception e)

final JFrame frame=new JFrame('Frame-ul meu');

Container contentPane = frame.getContentPane();

contentPane.setLayout(new GridLayout(1,1));

JButton Buton = new JButton('Apasa-ma!');

contentPane.add(Buton);

Buton.addActionListener(new ActionListener()

}

});

frame.addWindowListener(new WindowAdapter()

});

frame.pack();

frame.setVisible(true);

}

}

1.3.4.  Clasa JApplet

Clasa JApplet este folosita pentru implementarea applet-urilor. A se vedea exemplul 2.


Forma containere-lor principale este ilustrata in figura urmatoare:

1.4.   Containere intermediare

Sunt componente JFC folosite pentru organizarea ferestrelor. Container-ele intermediare folosesc la impartirea ferestrei in mai multe zone sau la gruparea componentelor. Swing furnizeaza urmatoarele containere intermediare:

Panel

- Este cel mai flexibil si frecvent utilizat container intermediar. Se implementeaza folosind clasa JPanel. Un panel grupeaza componentele dintr-o fereastra sau dintr-un alt panel. Un panel poate folosi orice layout manager si poate avea o margine (border).

Scroll Pane

- Furnizeaza scroll bar (orizontal si vertical) pentru componentele prea mari.

Split Pane

- Afiseaza doua componente intr-un spatiu fix, oferind utilizatorului posibilitatea sa redimensioneze fiecare componenta.

Tabbed Pane

- Contine mai multe componente dar afiseaza numai una la un moment dat. Utilizatorul poate alege intre componente.

Tool Bar

- Grupeaza componentele (in general butoane) intr-o linie sau o coloana, permitand utilizatorului sa o mute oriunde.

Forma containere-lor intermediare este ilustrata in figura urmatoare:

Exemplu 10: Pentru JScrollPane

JFrame frame = new JFrame('Doar un exemplu');

JTextArea t = new JTextArea(20, 40);

JScrollPane scrpane=new JScrollPane(t);

scrpane.setPreferredSize(new Dimension(100, 100));

frame.getContentPane().add(scrpane);

for(int i=0;i<100;i++)

t.append(i+'n');//(new Integer(i)).toString());

Exemplu 11: Pentru JSplitPane

JFrame frame = new JFrame('Doar un exemplu');

JTextArea t=new JTextArea();

for(int i=0;i<100;i++)

t.append(i+'n');

JLabel label=new JLabel('hjsdkljasldjasljdlafj');

JSplitPane splitpane=new JSplitPane();

splitpane.setOneTouchExpandable(true);

splitpane.setLeftComponent(t);

splitpane.setRightComponent(label);

splitpane.setPreferredSize(new Dimension(100, 100));

frame.getContentPane().add(splitpane);

Exemplu 11: Pentru JTabbedPane

import javax.swing.JTabbedPane;

import javax.swing.ImageIcon;

import javax.swing.JLabel;

import javax.swing.JPanel;

import javax.swing.JFrame;

import java.awt.*;

import java.awt.event.*;

public class AplicTabbed extends JPanel

protected Component crearePanel(String text)

public static void main(String[] args)

});

frame.getContentPane().add(

new AplicTabbed(), BorderLayout.CENTER);

frame.setSize(400, 125);

frame.setVisible(true);

}

}

Figura urmatoare ilustreaza executia exemplului.

1.5.   Folosirea gestionarilor de pozitionare (Layout Manager)

Un program poate avea interfete diferite, chiar daca sunt folosite aceleasi componente. Acest lucru se datoreaza folosirii a diferiti gestionari de pozitionare care controleaza dimensiunea si pozitiile componentelor.

Gestionarea pozitionarii este procesul prin care se determina dimensiunea si pozitia componentelor. Implicit, fiecare container are un gestionar de pozitionare - un obiect care gestioneaza pozitionarea fiecarei componente de pe container. Acest obiect implementeaza interfata LayoutManager. Acesta poate fi inlocuit cu altul care sa fie pe masura cerintelor. In general, se seteaza gestionarul de pozitionare pentru doua tipuri de containere: contentpane (foloseste implicit BorderLayout) si JPanel (foloseste implicit FlowLayout).

De cate ori se adauga o componenta pe container trebuie tinut cont de gestionarul de pozitionare al containerului respectiv.

1.5.1.  Setarea pozitionarii (Layout Manager-ului)

Pentru schimbarea layout manager-ului folosit de un container se apeleaza metoda setLayout. Metoda poate primi ca parametru orice instanta a unei clase care implementeaza interfata LayoutManager. Secventa de atasare a unui gestionar pentru un container este:

FlowLayout gestionar = new FlowLayout();

container.setLayout(gestionar);

sau:

container.setLayout(new FlowLayout());

De exemplu:

JPanel jp = new JPanel();

jp.setLayout(new BorderLayout());

Daca argumentul este null, container-ul nu foloseste un layout manager. In acest caz trebuie specificate dimensiunile si pozitiile fiecarei componente de pe container.

Cei mai folositi gestionari in Java sunt: BorderLayout, BoxLayout, FlowLayout, GridBagLayout si GridLayout.

1.5.1.1                   BorderLayout

BorderLayout este layout manager-ul implicit pentru fiecare container principal. Un BorderLayout are cinci zone in care pot fi asezate componentele: nord, sud, est, vest si centru.

Exemplu 12:

1.             import javax.swing.*;

2.             import java.awt.*;

3.             import java.awt.event.*;

4.             public class AplicBorderLayout extends JFrame

});

15.         f.setSize(400, 125);

16.         f.setVisible(true);

17.         }

18.         }

Tinand cont ca pentru frame-uri gestionarul implicit este BorderLayout, linia 8 nu mai este necesara. Rezultatul executiei acestui program este:




1.5.1.2                   BoxLayout

Gestionarul BoxLayout aseaza componentele pe o singura linie sau coloana. Respecta dimensiunile minime ale componentelor si permite alinierea lor.

Exemplu 13:

import javax.swing.*;

import java.awt.*;

import java.awt.event.*;

public class AplicBoxLayout extends JFrame

public static void main(String[] args)

});

f.pack();

f.setVisible(true);

}

}

Rezultatul executiei acestui program este:

1.5.1.3                   CardLayout

Clasa CardLayout permite implementarea unei arii care contine diferite componente la momente diferite. Tabbed pane-urile sunt containere intermediare care furnizeaza o functionalitate similara. Un CardLayout este in general controlat de un Combo Box, starea lui determinand panel-ul de afisat.

Exemplu 14:

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

public class AplicCardWindow extends JFrame

implements ItemListener ;

JPanel cbp = new JPanel();

JComboBox c = new JComboBox(comboBoxItems);

c.setEditable(false);

c.addItemListener(this);

cbp.add(c);

contentPane.add(cbp, BorderLayout.NORTH);

cards = new JPanel();

cards.setLayout(new CardLayout());

JPanel p1 = new JPanel();

p1.add(new JButton('Buton 1'));

p1.add(new JButton('Buton 2'));

p1.add(new JButton('Buton 3'));

JPanel p2 = new JPanel();

p2.add(new JTextField('TextField', 20));

cards.add(p1, BUTONPANEL);

cards.add(p2, TEXTPANEL);

contentPane.add(cards, BorderLayout.CENTER);

addWindowListener(new WindowAdapter()

});

}

public void itemStateChanged(ItemEvent evt)

public static void main(String args[])

}


In imaginea urmatoare se vad cele doua stari ale ferestrei in functie de starea Combo Box-ului:

1.5.1.4                   FlowLayout

FlowLayout este layout manager-ul implicit pentru orice JPanel. Aseaza componentele de la stanga spre dreapta, de sus in jos.

Exemplu 15:

import javax.swing.*;

import java.awt.*;

import java.awt.event.*;

public class AplicFlowLayout extends JFrame

public static void main(String[] args)

});

f.pack();

f.setVisible(true);

}


}
Rezultatul executiei acestui program este:

1.5.1.5                   GridLayout

GridLayout-ul aseaza componentele in celulele unui tabel. Fiecare componenta ocupa tot locul disponibil din celula. Toate celulele au aceeasi dimensiune. La redimesionarea ferestrei GridLayout-ului, celulele isi vor schimba dimensiunile astfel incat sa fie ocupat tot spatiul ferestrei.

Clasa GridLayout are doi constructori:

public GridLayout(int rows, int columns)

public GridLayout(int rows, int columns,

int horizontalGap, int verticalGap)

Cel putin unul din cele doua argumente rows si columns trebuie sa fie nenul. Argumentele horizontalGap si verticalGap din cel de-al doilea constructor permit specificarea numarului de pixeli dintre celule. Implicit ele au valoarea 0.

Exemplu 16:

import javax.swing.*;

import java.awt.*;

import java.awt.event.*;

public class AplicGridLayout extends JFrame

});

f.pack();

f.setVisible(true);

}

}

Rezultatul executiei acestui program este:

Constructorul apelat creeaza o instanta a lui GridLayout care are doua coloane si oricate linii sunt necesare - new GridLayout(0,2).

1.5.1.6                   GridBagLayout

GridBagLayout este cel mai sofisticat si flexibil layout manager pe care platforma Java il furnizeaza. Aseaza componentele in celulele unui tabel, fiecare componenta putand sa ocupe mai multe celule. Liniile / coloanele tabelului nu este obligatoriu sa aiba aceeasi inaltime / latime. Pentru fiecare componenta care se adauga pe fereastra se seteaza o serie de constrangeri prin crearea unui obiect al clasei GridBagConstraints. Aceeasi instanta a lui GridBagConstraints poate fi folosita pentru mai multe componente, chiar daca ele au constrangeri diferite. GridBagLayout extrage valorile constrangerilor si nu refoloseste GridBagConstraints. Clasa contine urmatoarele atribute care pot fi setate:

gridx, gridy - Specifica linia si coloana coltului din stanga sus a componentei. Coloana cea mai din stanga are gridx=0 iar linia cea mai de sus are gridy=0.

gridwidth, gridheight - Reprezinta numarul de coloane (pentru gridwidth) sau de linii (pentru gridheight) pe care va fi afisata componenta. Valoarea implicita este 1.

fill - Este folosita atunci cand aria de afisare a componentei este mai mare decat dimensiunea ceruta, pentru a determina cum poate fi redimensionata componenta. Valorile valide sunt:

         NONE (implicit),

         HORIZONTAL (mareste componenta pe orizontala astfel incat sa acopere intreaga suprafata disponibila dar nu schimba inaltimea),

         VERTICAL (mareste componenta pe verticala astfel incat sa acopere intreaga suprafata disponibila dar nu schimba latimea),

         BOTH (mareste componenta astfel incat sa acopere intreaga suprafata disponibila.

ipadx, ipady - Folosite pentru redimensionarea celulelor. Specifica cat trebuie adunat la dimensiunea minima a componentei. Valoarea implicita este 0. Latimea / inaltimea va avea valoarea minima plus ipadx*2 / ipady*2 pixeli (se aplica in ambele capete ale componentei).

insets - Specifica distanta dintre componenta si colturile suprafetei pe care se afiseaza. Valoarea atribuita este un obiect Insets.

anchor - Este folosita atunci cand componenta este mai mica decat suprafata pe care urmeaza sa fie afisata, pentru a determina unde se plaseaza componenta. Valori valide sunt CENTER (implicit), NORTH, NORTHEAST, EAST, SOUTHEAST, SOUTH, SOUTHWEST, WEST si NORTHWEST.

weightx, weighty - Folosite pentru a determina modul in care sa fie repartizat spatiul dintre coloane / linii. Daca nu se specifica nici o valoare (implicit este 0) atunci toate componentele vor fi grupate in centru container-ului deoarece GridBagLayout pune orice spatiu in plus intre tabel si colturile container-ului.

Exemplu 17:

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

public class AplicGridBagLayout extends JFrame

buton = new JButton('Buton 1');

if (shouldWeightX)

c.gridx = 0;

c.gridy = 0;

gridbag.setConstraints(buton, c); //constrangerile impuse sunt atasate componentei

contentPane.add(buton);

buton = new JButton('2');

c.gridx = 1;

c.gridy = 0;

gridbag.setConstraints(buton, c);

contentPane.add(buton);

buton = new JButton('Buton 3');

c.gridx = 2;

c.gridy = 0;

gridbag.setConstraints(buton, c);

contentPane.add(buton);

buton = new JButton('Buton 4 foarte lung');

c.ipady = 40; //seteaza cu cat va creste inaltimea componentei

c.weightx = 0.0;

c.gridwidth = 3;

c.gridx = 0;

c.gridy = 1;

gridbag.setConstraints(buton, c);

contentPane.add(buton);

buton = new JButton('Button 5');

c.ipady = 0; //se revine la inaltimea implicita

c.weighty = 1.0; //spatiu vertical intre celule suplimentar

c.anchor = GridBagConstraints.SOUTH; //componenta va fi plasata in partea de jos a ferestrei

c.insets = new Insets(10,0,0,0);

c.gridx = 1; //componenta se alinieaza cu butonul 2

c.gridwidth = 2; //ocupa latimea a doua butoane

c.gridy = 2; //se afla pe a treia linie

gridbag.setConstraints(buton, c);

contentPane.add(buton);

addWindowListener(new WindowAdapter()

});

}

public static void main(String args[])

}


Rezultatul executiei acestui program este:

1.6.   Tratarea evenimentelor

Apasarea unei taste sau a unui buton al mouse-ului declanseaza un eveniment. Pentru a trata evenimentul este necesar un obiect care sa implementeze interfata corespunzatoare si sa fie inregistrat ca un consumator de evenimente (event listener). Componentele Swing pot genera mai multe tipuri de evenimente. Cateva dintre interfetele corespunzatoare ar fi:

ActionListener

actiuni asupra unui control (click pe un buton, Enter dupa introducerea unui text intr-un camp, selectarea intr-un meniu)

ComponentListener

redimensionari, deplasari, ascunderi ale unei componente

FocusListener

preluare / pierdere focus

ItemListener

selectie / deselectie obiect in lista, meniu, etc.

TextListener

modificarea textului din control

AdjustmentListener

modificarea unei valori variind intre doua limite (ex: ScrollBar)

KeyListener

actionarea unei taste

MouseListener

apasarea butonului mouse-ului in timp ce cursorul se afla pe componenta respectiva

MouseMotionListener

drag; miscarea mouse-ului pe o componenta

WindowListener

inchidere, minimizare, maximizare etc.

ContainerListener

adaugare, stergere componenta

ListSelectionListener

schimbarea selectiei intr-o tabela sau intr-o lista

Fiecare eveniment este reprezentat de un obiect care da informatii despre eveniment si identifica sursa evenimentului. Fiecare generator de eveniment poate avea mai multi consumatori.

 

generator obiect eveniment /----> consummator de eveniment

de eveniment------------------------------------------> consummator de eveniment

----> consummator de eveniment

Un eveniment, o data aparut, este distribuit tuturor ascultatorilor inregistrati (nu este consumat numai de primul).

Asa cum am spus mai devreme, pentru ca evenimentele unei componente sa fie interceptate de catre o instanta a unei clase ascultator, aceasta clasa trebuie inregistrata in lista ascultatorilor componentei respective. Am spus lista, deoarece evenimentele unei componente pot fi ascultate de oricate clase - cu conditia ca acestea sa fie inregistrate la componenta respectiva. Inregistrarea unei clase in lista ascultatorilor unei componente se face cu metode din clasa Component de tipul addXXXListener, iar eliminarea ei din aceasta lista cu removeXXXListener unde XXX reprezinta tipul evenimentului.

1.6.1.  Exemplu de tratare a unui eveniment

Sunt necesari urmatorii pasi:

1.Clasa trebuie sa implementeze interfata corespunzatoare sau sa extinda o clasa care implementeaza interfata.

 public class NumeClasa implements ActionListener 
 

2.Scrierea codului care inregistreaza o instanta a clasei (care va consuma evenimentul) ca si consumator pentru una sau mai multe componente.

 Componenta.addActionListener(instantaNumeClasa);
 

3.Scrierea codul care implementeaza metodele din interfata consumator.

 public void actionPerformed(ActionEvent e) 
 

Exemplu 18:

import javax.swing.*;

import java.awt.*;

import java.awt.event.*;

public class AplicEv extends JFrame

public static void main(String[] args)

});

f.addWindowListener(f.lsn);

f.setSize(400, 125);

//f.pack();

f.setVisible(true);

}

}

class TextWorker implements ActionListener

public void actionPerformed(ActionEvent e)

if(c.equals('ActMinuscule'))

}

}

class Listener extends JTextArea implements ActionListener, WindowListener

public void actionPerformed(ActionEvent e)

public void windowClosed(WindowEvent e)

public void windowOpened(WindowEvent e)

public void windowClosing(WindowEvent e)

public void windowIconified(WindowEvent e)

public void windowDeiconified(WindowEvent e)

public void windowActivated(WindowEvent e)

public void windowDeactivated(WindowEvent e)

}

Rezultatul executiei programului este:

1.7.   Folosirea componentelor

1.7.1.  Clasa JLabel

Un obiect de tip JLabel (eticheta) reprezinta o componenta pentru plasarea unui text pe o suprafata de afisare. O eticheta este formata dintr-o singura linie de text static ce nu poate fi modificat de catre utilizator, dar poate fi modificat din program.

1.7.2.  Clasa JButton

Un obiect de tip JButton (buton) reprezinta o componenta pentru plasarea unui buton etichetat pe o suprafata de afisare.

1.7.3.  Clasa JTextField

Un obiect de tip JTextField defineste un control de editare a textului pe o singura linie. Este util pentru interogarea utilizatorului asupra unor valori.

1.7.4.  Clasa JTextArea

Un obiect de tip JTextArea defineste un control de editare a textului pe mai multe linii. Este util pentru editarea de texte, introducerea unor comentarii, etc .

1.7.5.  Clasa JCheckBox

Un obiect de tip JCheckbox (comutator) reprezinta o componenta care se poate afla in doua stari : 'selectata' sau 'neselectata' (on/off). Actiunea utilizatorului asupra unui comutator il trece pe acesta in starea complementara celei in care se gasea. Este folosit pentru a prelua o anumita optiune de la utilizator.

1.7.6.  Clasa JRadioButton

Un obiect de tip JRadioButton defineste un grup de comutatoare din care doar unul poate fi selectat. Uzual, aceste componente se mai numesc radio butoane.

1.7.7.  Clasa JComboBox

Un obiect de tip JComboBox defineste o lista de optiuni din care utilizatorul poate selecta una singura. La un moment dat, din intreaga lista doar o singura optiune este vizibila, cea selectata. O componenta JComboBox este insotita de un buton etichetat cu o sageata verticala la apasarea caruia este afisata intreaga sa lista, pentru ca utilizatorul sa poata selecta o anumita optiune.

1.7.8.  Clasa JList

Un obiect de tip JList defineste o lista de optiuni care poate fi setata astfel incat utilizatorul sa poata selecta o singura optiune sau mai multe. Toate optiunile listei sunt vizibile in limita dimensiunilor grafice ale componentei.

1.7.9.  Clasa JScrollBar

Un obiect de tip JScrollbar defineste o bara de defilare verticala sau orizontala. Este utila pentru punerea la dispozitie a utilizatorului a unei modalitati sugestive de a alege o anumita valoare dintr-un interval.



Politica de confidentialitate | Termeni si conditii de utilizare



DISTRIBUIE DOCUMENTUL

Comentarii


Vizualizari: 2672
Importanta: rank

Comenteaza documentul:

Te rugam sa te autentifici sau sa iti faci cont pentru a putea comenta

Creaza cont nou

Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved