(varianta pdf)

SwRTc – supliment proiect

Interfete grafice Swing si applet-uri Java

 

 

GUI.1. Descrierea laboratorului

 

In aceasta lucrare de laborator vor fi acoperite urmatoarele probleme:

·      crearea interfetelor grafice Java folosind Java Swing

·      tratarea evenimentelor (interactivitatea) in interfetele grafice Swing

·      crearea si instalarea applet-urilor (miniaplicatiilor) Java

 

 

GUI.2. Introducere in interfete grafice Swing

 

GUI.2.1. Elementele unei aplicatii grafice Swing

 

Programul ElementeAplicatieSwing ilustreaza elementele unei aplicatii grafice Swing (script pentru compilarea si executia lui):

 

1. Importul pachetelor Swing si AWT necesare

 

 

  import javax.swing.*;          // Numele actual al pachetului Swing

  import java.awt.*;             // Numele pachetului AWT (necesar uneori)

  import java.awt.event.*;       // Numele pachetului pentru tratarea

                                 // evenimentelor, pentru interactivitate

  public class ElementeAplicatieSwing {

    public static void main(String[] args) {

      // codul metodei principale

    }

  }

2. Optional: stabilirea aspectului (Java, Windows, CDE/Motif)

 

 

      try {

          UIManager.setLookAndFeel(

              UIManager.getCrossPlatformLookAndFeelClassName());

      } catch (Exception e) { }

 

3. Stabilirea containerului de nivel maxim (fereasta principala - JFrame, fereastra secundara - JDialog, applet - JApplet)

 

 

      JFrame frame = new JFrame("Elementele unei aplicatii Swing");

 

4. Obtinerea panoului de continut (content pane) intern cadrului (containerul in care vor fi plasate componentele ferestrei)

 

 

      Container container = frame.getContentPane(); //

 

5. Optional: Stabilirea modului de asezare (layout-ului) a panoului (care implicit e FlowLayout)

 

 

      container.setLayout(new BorderLayout());

 

 

6. Crearea si configurarea componentelor grafice (controalelor)

 

 

In cazul programului ElementeAplicatieSwing:

 

- crearea unei etichete:

 

 

      final String textEticheta = "Numarul de actionari ale butonului: ";

      final JLabel eticheta = new JLabel(textEticheta + "0    ");

 

- crearea unui buton, si atasarea unei combinatii de taste echivalente, [Alt] + I:

 

 

      JButton buton = new JButton("Sunt un buton Swing!");

      buton.setMnemonic(KeyEvent.VK_I);

 

- crearea si configurarea unui panou (componenta care grupeaza spatial alte componente):

 

 

      JPanel panou = new JPanel();

 

      // Stabilirea spatiului gol care inconjoara continutul panoului

      panou.setBorder(BorderFactory.createEmptyBorder(

                                      30,    // sus

                                      30,    // in stanga

                                      10,    // jos

                                      30));  // in dreapta

      // Stabilirea modului de asezare (layout-ului) a componentelor

      panou.setLayout(new GridLayout(0, 1));

 

      // Adaugarea componentelor in panou

      panou.add(buton);

      panou.add(eticheta);

 

7. Adaugarea in fereastra principala a componentelor grafice (controalelor)

 

 

      container.add(panou, BorderLayout.CENTER);

 

8. Crearea codului pentru tratarea evenimentelor (interactivitatii)

 

 

Atasarea unui obiect al unei clase anonime care implementeaza interfata ActionListener, a carui metoda actionPerformed() trateaza actionarea butonului:

 

 

      buton.addActionListener(new ActionListener() {

        int numActionari = 0;

 

        public void actionPerformed(ActionEvent e) {

          numActionari++;

          eticheta.setText(textEticheta + numActionari);

        }

      });

 

 

Stabilirea iesirii din program la inchiderea ferestrei, prin atasarea unui obiect al unei clase anonime care extinde clasa ActionListener, a carui metoda windowClosing() trateaza inchiderea ferestrei:

 

 

      frame.addWindowListener(new WindowAdapter() {

          public void windowClosing(WindowEvent e) {

              System.exit(0);

          }

      });

 

Alternativa pentru stabilirea iesirii din program la inchiderea ferestrei, incepand cu versiunea 1.3 a Java 2 SE:

 

 

      // Alternativa, incepand cu Java 2, versiunea 1.3:

      //      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

 

 

9. Stabilirea dimensiunii ferestrei

 

Stabilirea dimensiunii ferestrei in functie de cea a componentelor:

 

 

      frame.pack();

 

Impunerea dimensiunii ferestrei:

 

 

      // Alternativa pentru cazul ca se doreste impunerea unei dimensiuni

      //      frame.setSize(400,    // latime

      //                    300);   // inaltime

 

10. Prezentarea ferestrei pe ecran

 

 

      frame.setVisible(true);

 

Fereastra obtinuta prin executia programului ElementeAplicatieSwing.java:

 

 

Iata si codul unui program, TestFrame, care ilustreaza crearea unei ferestre, fara componente grafice, a carei inchidere duce la iesirea din program (script pentru compilarea si executia lui).

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

  // 1. Importul pachetelor Swing si AWT necesare

  import javax.swing.*;         

 

  public class TestFrame {

    public static void main(String[] args) {

 

      // 2. Stabilirea containerului de nivel maxim

      JFrame frame = new JFrame(

                       "Fereastra cu iesire din program la inchidere");

 

      // 3. Stabilirea dimensiunii ferestrei

      frame.setSize(400,    // latime

                    300);   // inaltime

 

      // 4. Stabilirea iesirii din program la inchiderea ferestrei

      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

 

      // 5. Prezentarea ferestrei pe ecran

      frame.setVisible(true);

    }

  }

 

In lipsa codului din linia 16 (ca in programul TestFrame2 - script pentru compilarea si executia lui) inchiderea ferestrei nu conduce la iesirea din program, ceea ce poate fi neplacut pentru utilizator.

 

Desigur, exista si posibilitatea de a crea coduri mai simple, de exemplu prin compactarea etapelor 4 si 7:

 

 

      frame.getContentPane().add(panou, BorderLayout.CENTER);

 

GUI.2.2. Modalitati de a crea containerul de nivel maxim

 

 

Exista urmatoarele modalitati de a crea containere de nivel maxim:

 

1. Includerea unui obiect de tip Frame (fereastra principala in programele Java de sine statatoare)

 

Programul IncludereJFrame ilustreaza crearea unei ferestre principale prin includerea unui obiect de tip JFrame, fereastra in care sunt asezate 5 butoane, folosind asezarea relativ la margini - BorderLayout (script pentru compilarea si executia lui).

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

import java.awt.*;

import javax.swing.*;

/**

 * Demonstreaza includerea unui obiect JFrame pentru a crea o fereastra pe ecran.

 */

public class IncludereJFrame {

    public static void main(String[] args) {

      // Crearea obiectului cadru, cu titlu specificat

      JFrame cadru = new JFrame("Demo includere JFrame si asezare BorderLayout");

 

      // Obtinerea panoului de continut intern cadrului (container de componente)

      Container container = cadru.getContentPane();

 

      // Asezarea componentelor in panou (la 10 pixeli de marginea panoului)

      container.setLayout(new BorderLayout(10, 10));

 

      // Adaugarea a 5 butoane la panoul cadrului (ferestrei)

      container.add(new JButton("Est (Dreapta)"), BorderLayout.EAST);

      container.add(new JButton("Sud (Jos)"), BorderLayout.SOUTH);

      container.add(new JButton("Vest (Stanga)"), BorderLayout.WEST);

      container.add(new JButton("Nord (Sus)"), BorderLayout.NORTH);

      container.add(new JButton("Centru"), BorderLayout.CENTER);

 

      // Din jdk1.3, pentru terminarea programului la inchiderea ferestrei

      // cadru.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

 

      // Stabilirea dimensiunii ferestrei

      // - impunand dimensiunile ferestrei (nepotrivita la BorderLayout):

      //      cadru.setSize(100, 100);

      // - compactand componentele adaugate:

      cadru.pack();

 

      // Stabilirea vizibilitatii ferestrei (Atentie: implicit e false!)

      cadru.setVisible(true);

    }

}

 

Fereastra obtinuta prin executia programului IncludereJFrame.java:

 

 

 

2. Extinderea clasei Frame (fereastra principala in programele Java de sine statatoare)

 

Programul ExtensieJFrame ilustreaza crearea unei ferestre principale prin extinderea clasei JFrame, si asezarea relativ la margini - BorderLayout (script pentru compilarea si executia lui).

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

import java.awt.*;

import javax.swing.*;

/**

 * Demonstreaza extinderea JFrame pentru a crea o fereastra pe ecran.

 */

public class ExtensieJFrame extends JFrame {

    public ExtensieJFrame() {

      // Obtinerea panoului de continut intern cadrului (container de componente)

      Container container = getContentPane();

 

      // Asezarea componentelor in panou (la 10 pixeli de marginea panoului)

      container.setLayout(new BorderLayout(10, 10));

      // Adaugarea a 5 butoane la panoul cadrului (ferestrei)

      container.add(new JButton("Est (Dreapta)"), BorderLayout.EAST);

      container.add(new JButton("Sud (Jos)"), BorderLayout.SOUTH);

      container.add(new JButton("Vest (Stanga)"), BorderLayout.WEST);

      container.add(new JButton("Nord (Sus)"), BorderLayout.NORTH);

      container.add(new JButton("Centru"), BorderLayout.CENTER);

    }

 

    public static void main(String[] args) {

      // Crearea obiectului cadru

      ExtensieJFrame cadru = new ExtensieJFrame();

 

      // Adaugarea titlului ferestrei

      cadru.setTitle("Demo extindere JFrame si asezare BorderLayout");

 

      // Compactarea componentelor

      cadru.pack();

      // Stabilirea vizibilitatii ferestrei (Atentie: implicit e false!)

      cadru.setVisible(true);

    }

}

 

Fereastra obtinuta prin executia programului ExtensieJFrame.java:

 

 

3. Extinderea clasei JApplet (miniaplicatie (applet) Java)

 

Programul ExtensieJApplet ilustreaza crearea unei miniaplicatii (applet) prin extinderea clasei JApplet, si asezarea relativ la margini BorderLayout (script pentru compilarea lui).

 

 

Pentru includerea unei miniaplicatii intr-o pagina HTML in vederea vizualizarii ei se va adauga in corpul fisierului .html urmatorul cod:

 

 

<APPLET  CODE = "ExtensieJApplet.class" WIDTH = 400 HEIGHT = 200 >

</APPLET>

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

import java.awt.*;

import javax.swing.*;

/**

 * Demonstreaza extinderea JApplet pentru a o miniaplicatie Java.

 *

 * Se executa prin includerea intr-o pagina Web a unui tag HTML de genul:

 *    <APPLET  CODE = "ExtensieJApplet.class" WIDTH = 400 HEIGHT = 200 >

 *    </APPLET>

 */

public class ExtensieJApplet extends JApplet {

    /**

     * Metoda de initializare a appletului. Apelata de browser la prima

     * utilizare a appletului, stabileste layout-ul (modul de dispunere a

     * componentelor in panoul de continut) si adauga componentele in panou.

     */

    public void init() {

      // Obtinerea panoului de continut intern cadrului (container de componente)

      Container container = getContentPane();

 

      // Asezarea componentelor in panou (la 10 pixeli de marginea panoului)

      container.setLayout(new BorderLayout(10, 10));

 

      // Adaugarea a 5 butoane la panoul appletului

      container.add(new JButton("Est (Dreapta)"), BorderLayout.EAST);

      container.add(new JButton("Sud (Jos)"), BorderLayout.SOUTH);

      container.add(new JButton("Vest (Stanga)"), BorderLayout.WEST);

      container.add(new JButton("Nord (Sus)"), BorderLayout.NORTH);

      container.add(new JButton("Centru"), BorderLayout.CENTER);

    }

}

 

Pagina HTML RunExtensieJApplet.html permite vizualizarea appletului ExtensieJApplet. Iata cum poate arata pagina RunExtensieJApplet.html vizualizata intr-un browser:

 

4. Crearea unui obiect de tip JDialog, pentru a crea o fereastra secundara

 

5. Crearea ferestrelor de dialog predefinite utilizand metodele clasei JOptionPane

 

Metoda showInputDialog() a clasei JOptionPane este folosita pentru a crea dialoguri de intrare, metoda showMessageDialog() pentru a crea dialoguri de informare a utilizatorului, etc.


 

GUI.2.3. Crearea interactivitatii aplicatiilor si miniaplicatiilor grafice Swing

 

 

Programele din sectiunea anterioara creau butoane care nu reactioneaza la actionarea lor de catre utilizator.

 

Pentru introducerea interactivitatii, trebuie tratate evenimentele din interfata grafica. In Java exista mai multe moduri de tratare a evenimentelor.

 

Incepand cu versiunea initiala, JDK 1.0, interfetele grafice realizate cu biblioteca AWT au 2 moduri de tratare a evenimentelor:

 

1. Implementand metoda action(), care:

 

- primeste ca parametri un obiect de tip Event care incapsuleaza evenimentul produs, si un obiect de tip Object care incapsuleaza parametrii acestuia,

 

- testeaza atributele target si id ale obiectului de tip Event pentru a identifica obiectul tinta (in care s-a produs evenimentul) si tipul de actiune produsa, si trateaza apoi evenimentul respectiv

 

2. Implementand metoda handleEvent(), care:

 

- primeste ca parametru un obiect de tip Event care incapsuleaza evenimentul produs,

 

- testeaza atributele target si id ale obiectului de tip Event pentru a identifica obiectul tinta (in care s-a produs evenimentul) si tipul de actiune produsa, si trateaza apoi evenimentul respectiv

 

 

Incepand cu versiunea JDK 1.1, interfetele grafice realizate cu biblioteca AWT au:

 

3. Un nou mod de tratare a evenimentelor, utilizat si de interfetele grafice Swing, care presupune trei operatii:

 

- (a) declararea unei clase care implementeaza o interfata « ascultator de evenimente », (care contine metode ce trebuie implementate de utilizator pentru tratarea evenimentului respectiv), sau (b) declararea unei clase care extinde o clasa predefinita care implementeaza o interfata « ascultator de evenimente »

 

- (a) implementarea tuturor metodelor definite in interfata « ascultator de evenimente », sau (b) re-implementarea metodelor dorite din clasa extinsa care implementeaza interfata

 

- inregistrarea unui obiect din clasa « ascultator de evenimente » de catre fiecare dintre componentele grafice (numite tinta sau sursa) pentru care se doreste tratarea evenimentului respectiv

 

Programul ExtensieInteractivaJFrame ilustreaza crearea unei ferestre principale prin extinderea clasei JFrame, asezarea relativ la margini - BorderLayout, si tratarea evenimentului « actionare » pentru componentele buton (script pentru compilarea si executia lui).

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

/**

 * Extinderea JFrame pentru a crea o fereastra cu componente interactive pe ecran.

 */

public class ExtensieInteractivaJFrame extends JFrame {

    public ExtensieInteractivaJFrame() {

      // Obtinerea panoului de continut intern cadrului (container de componente)

      Container container = getContentPane();

 

      // Asezarea componentelor in panou (la 10 pixeli de marginea panoului)

      container.setLayout(new BorderLayout(10, 10));

 

      // Adaugarea a 5 butoane la panoul cadrului (ferestrei)

      JButton b1 = new JButton("Est (Dreapta)");

      JButton b2 = new JButton("Sud (Jos)");

      JButton b3 = new JButton("Vest (Stanga)");

      JButton b4 = new JButton("Nord (Sus)");

      JButton b5 = new JButton("Centru");

      container.add(b1, BorderLayout.EAST);

      container.add(b2, BorderLayout.SOUTH);

      container.add(b3, BorderLayout.WEST);

      container.add(b4, BorderLayout.NORTH);

      container.add(b5, BorderLayout.CENTER);

 

      // Inregistrarea "ascultatorului" de "evenim.actionare" la "sursele" evenim.

      b1.addActionListener(obiectAscultatorActionare);

      b2.addActionListener(obiectAscultatorActionare);

      b3.addActionListener(obiectAscultatorActionare);

      b4.addActionListener(obiectAscultatorActionare);

      b5.addActionListener(obiectAscultatorActionare);

 

      // Inregistrarea "ascultatorului" de "evenimente fereastra "

      this.addWindowListener(ascultatorInchidereFereastra);

    }

 

    // Crearea unui obiect "ascultator" de "evenimente actionare"

    ActionListener obiectAscultatorActionare = new ActionListener() {

 

      // Tratarea actionarii unui buton

      public void actionPerformed(ActionEvent ev) {

        // Mesaj informare

        System.out.println("A fost apasat un buton " + ev.getActionCommand());

      }     

    };

 

    // Crearea unui "adaptor pentru ascultator" de "evenimente fereastra"

    WindowAdapter ascultatorInchidereFereastra = new WindowAdapter() {

 

      // Tratarea inchiderii ferestrei curente

      public void windowClosing(WindowEvent ev) {

        // Terminarea programului

        System.exit(0);

      }

    };

 

    public static void main(String[] args) {

      // Crearea obiectului cadru

      ExtensieInteractivaJFrame cadru = new ExtensieInteractivaJFrame();

 

      // Adaugarea titlului ferestrei

      cadru.setTitle("Demo extindere JFrame interactiva");

      // Compactarea componentelor

      cadru.pack();

      // Stabilirea vizibilitatii ferestrei (Atentie: implicit e false!)

      cadru.setVisible(true);

    }

}

 

Programul ExtensieInteractivaJApplet ilustreaza crearea unei miniaplicatii (applet) prin extinderea clasei JApplet, si tratarea evenimentului « actionare » pentru componentele buton (script pentru compilarea lui).

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

Import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

 

public class ExtensieInteractivaJApplet extends JApplet {

 

    public void init() {

      // Obtinerea panoului de continut (content pane) creat de browser pentru

      // executia appletului (container in care vor fi plasate componentele)

      Container container = getContentPane();

 

      // Stabilirea layout-ului panoului, BorderLayout cu spatiu 10 pixeli

      container.setLayout(new BorderLayout(10, 10));

      // Adaugarea a 5 butoane la panoul appletului

      JButton b1 = new JButton("Est (Dreapta)");

      JButton b2 = new JButton("Sud (Jos)");

      JButton b3 = new JButton("Vest (Stanga)");

      JButton b4 = new JButton("Nord (Sus)");

      JButton b5 = new JButton("Centru");

      container.add(b1, BorderLayout.EAST);

      container.add(b2, BorderLayout.SOUTH);

      container.add(b3, BorderLayout.WEST);

      container.add(b4, BorderLayout.NORTH);

      container.add(b5, BorderLayout.CENTER);

 

      // Crearea unui obiect "ascultator" de "evenimente actionare"

      // (pe care le trateaza)

      ActionListener obiectAscultatorActionare = new ActionListener() {

 

        // Tratarea actionarii unui buton

        public void actionPerformed(ActionEvent ev) {

 

          // Mesaj informare in consola Java

          System.out.println("A fost apasat butonul " + ev.getActionCommand());

 

          // Mesaj informare in bara de stare

          showStatus("Apasat butonul " + ev.getActionCommand());

        }     

      };

 

      // Inregistrarea "ascultatorului" de "evenimente actionare" la "sursele"

      // de evenimente

      b1.addActionListener(obiectAscultatorActionare);

      b2.addActionListener(obiectAscultatorActionare);

      b3.addActionListener(obiectAscultatorActionare);

      b4.addActionListener(obiectAscultatorActionare);

      b5.addActionListener(obiectAscultatorActionare);

    }

}

 

Pagina RunExtensieInteractivaJApplet.html permite vizualizarea applet-ului. Iata cum poate arata pagina RunExtensieJApplet.html vizualizata intr-un browser:

 

 

GUI.2.4. Utilizarea componentelor grafice Swing pentru lucrul cu text

 

Programul EcouGrafic_Swing ilustreaza utilizarea componentelor grafice Swing pentru lucrul cu text, de tip JTextField si JTextArea (script pentru compilarea si executia lui).

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

00

01

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

/**

  * Ecou grafic folosind JtextField si JTextArea

  */

public class EcouGrafic_Swing extends JFrame {

  /**

    * Intrare - linie de text grafica (JtextField)

    */

  private static JTextField inTextGrafic;

  /**

    * Iesire - zona de text grafica (JtextArea)

    */

  private static JTextArea outTextGrafic;

 

  /**

    * Initializari grafice

    */

  public EcouGrafic_Swing() {

 

    // Stabilire titlu fereastra (JFrame)

    super("Ecou grafic simplu Swing");

    Container containerCurent = this.getContentPane();

    containerCurent.setLayout(new BorderLayout());

 

    // Zona de text non-editabila de iesire (cu posibilitati de defilare)

 

    outTextGrafic = new JTextArea(5, 40);

    JScrollPane scrollPane = new JScrollPane(outTextGrafic,

                     JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,

                     JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);

    containerCurent.add("Center", scrollPane);

    outTextGrafic.setEditable(false);

 

    // Camp de text editabil de intrare

 

    inTextGrafic = new JTextField(40);

    containerCurent.add("South", inTextGrafic);

 

    System.out.println("\nPentru oprire introduceti '.' si <Enter>\n");

 

    // Inregistrarea "ascultatorului" de "evenimente actionare" la

    // "obiectul sursa" intrare de text

    inTextGrafic.addActionListener(ascultatorInText);

 

    // Inregistrarea "ascultatorului" de "evenimente fereastra" la

    // "sursa" (fereastra curenta)

    this.addWindowListener(ascultatorInchidere);

 

    // Impachetarea (compactarea) componentelor in container

    pack();                         

    // Fereastra devine vizibila - echivalent cu frame.setVisible(true)

    show();                    

    // Cerere focus pe intrarea de text din fereastra curenta    

    inTextGrafic.requestFocus();

  }

 

  /**

    * Crearea unui "ascultator" de "evenimente actionare", obiect al unei

    * clase "anonime" care implementeaza interfata ActionListener

    */

  ActionListener ascultatorInText = new ActionListener() {

    /**

      * Tratarea actionarii intrarii de text (introducerii unui "Enter")

      */

    public void actionPerformed(ActionEvent ev) {

      // Citirea unei linii de text din intrarea de text grafica

      String sirCitit = inTextGrafic.getText();                

      // Pregatirea intrarii de text pentru noua intrare (golirea ei)

      inTextGrafic.setText("");

 

      // Scrierea liniei de text in zona de text grafica

      outTextGrafic.append("S-a introdus: " + sirCitit + "\n");

      // Conditie terminare program

      if (sirCitit.equals(new String(".")))   System.exit(0); 

    }     

  };

 

  /**

    * Crearea unui "adaptor pentru ascultator" de "evenimente fereastra"

    * Obiect al unei clase "anonime" care extinde clasa WindowAdapter

    */

  WindowAdapter ascultatorInchidere = new WindowAdapter() {

 

    /**

      * Tratarea inchiderii ferestrei curente

      */

    public void windowClosing(WindowEvent ev) {

      // Terminarea programului

      System.exit(0);                                   

    }

  };

 

  /**

    * Punctul de intrare in program

    */

  public static void main (String args[]) {

    EcouGrafic_Swing ecouGraficJTFJTA = new EcouGrafic_Swing();

  }

}

 

Fereastra obtinuta prin executia programului EcouGrafic_Swing.java:

 

 

GUI.2.5. Surse multiple de evenimente tratate de un singur ascultator

 

Programul SurseMultiple ilustreaza tratarea evenimentelor generate de surse (componente grafice Swing) multiple (script pentru compilarea si executia lui).

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

00

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

/**

 *  Ilustreaza surse multiple de evenimente

 */

public class SurseMultiple extends JFrame {

  private JTextField intrareNume;

  private JButton butonConfirmareNume;

  private String nume;

  private boolean numeIntrodus = false;

  private JTextField intrarePrenume;

  private JButton butonConfirmarePrenume;

  private String prenume;

  private boolean prenumeIntrodus = false;

 

  private JTextField intrareNickname;

  private JButton butonConfirmareNickname;

  private String nickname;

  private boolean nicknameIntrodus = false;

  /**

   * Initializeaza obiectul de tip SurseMultiple

   */

  public SurseSiAscultatoriMultipli() {

    // Apel al constructorului supraclasei (JFrame) pentru stabilirea titlului

    super ("Va rugam sa va prezentati!");                                   

 

    // Containerul ferestrei grafice

    Container containerFereastra = this.getContentPane();

 

    // Stabilirea modului de asezare a componentelor in fereastra (layoutului)

    containerFereastra.setLayout(new GridLayout(3,2));

 

    // Camp de text pentru introducerea numelui

    intrareNume = new JTextField(20);

    containerFereastra.add(intrareNume);

 

    // Buton pentru confirmarea introducerii numelui

    butonConfirmareNume = new JButton("Numele dvs.");

    containerFereastra.add(butonConfirmareNume);

 

    // Camp de text pentru introducerea prenumelui

    intrarePrenume = new JTextField(20);

    containerFereastra.add(intrarePrenume);

 

    // Buton pentru confirmarea introducerii prenumelui

    butonConfirmarePrenume = new JButton("Prenumele dvs.");

    containerFereastra.add(butonConfirmarePrenume);

 

    // Camp de text pentru introducerea numelui utilizatorului

    intrareNickname = new JTextField(20);

    containerFereastra.add(intrareNickname);

 

    // Buton pentru confirmarea introducerii numelui utilizatorului

    butonConfirmareNickname = new JButton("Nume dvs. de utilizator");

    containerFereastra.add(butonConfirmareNickname);

 

    // Inregistrarea "ascultatorilor" de "evenimente actionare" 

    // Butoane (actionare = click pe buton)

    butonConfirmareNume.addActionListener(ascultatorEvenimenteActionare);

    butonConfirmarePrenume.addActionListener(ascultatorEvenimenteActionare);

    butonConfirmareNickname.addActionListener(ascultatorEvenimenteActionare);

 

    // Intrari grafice de text (actionare = apasare <Enter>)

    intrareNume.addActionListener(ascultatorEvenimenteActionare);

    intrarePrenume.addActionListener(ascultatorEvenimenteActionare);

    intrareNickname.addActionListener(ascultatorEvenimenteActionare);

 

    // Inregistrarea "ascultatorului" de "evenimente fereastra" la "sursa"

    // (fereastra curenta)

    this.addWindowListener(ascultatorInchidere);

    // Impachetarea (compactarea) componentelor in container

    pack();                         

    // Fereastra devine vizibila - echivalent cu frame.setVisible(true)

    show();                    

  }

  /** Crearea unui "ascultator" de "evenimente actionare", obiect al unei

    * clase "anonime" care implementeaza interfata ActionListener    */

  WindowAdapter ascultatorInchidere = new WindowAdapter() {

    public void windowClosing(WindowEvent ev) {

      // Terminarea programului

      System.exit(0);                                    

    }

  };

  /**

    * Crearea unui "ascultator" de "evenimente actionare"

    * Obiect al unei clase "anonime" care implementeaza interfata ActionListener

    */

  ActionListener ascultatorEvenimenteActionare = new ActionListener() {

 

    /**

      * Tratarea evenimentului actionare pentru ascultatorii inregistrati

      */

    public void actionPerformed(ActionEvent ev) {

 

      // Eveniment legat de introducerea numelui

      if ((ev.getSource() == butonConfirmareNume) ||

          (ev.getSource() == intrareNume)) {

 

        // Culegerea informatiilor din intrarea text

        nume = intrareNume.getText();

 

        // Tratarea actionarilor asociate introducerii numelui

        System.out.println("A fost introdus numele: " + nume);

 

        // Dezactivarea posibilitatii de modificare a numelui

        intrareNume.setEditable(false);

        butonConfirmareNume.setEnabled(false);

 

        numeIntrodus = true;

      }

 

      // Eveniment legat de introducerea prenumelui

      else if ((ev.getSource() == butonConfirmarePrenume) ||

               (ev.getSource() == intrarePrenume)) {

 

        // Culegerea informatiilor din intrarea text

        prenume = intrarePrenume.getText();

 

        // Tratarea actionarilor asociate introducerii numelui

        System.out.println("A fost introdus prenumele: " + prenume);

 

        // Dezactivarea posibilitatii de modificare a prenumelui

        intrarePrenume.setEditable(false);

        butonConfirmarePrenume.setEnabled(false);

 

        prenumeIntrodus = true;

      }

      // Eveniment legat de introducerea numelui de utilizator

      else if ((ev.getSource() == butonConfirmareNickname) ||

               (ev.getSource() == intrareNickname)) {

 

        // Culegerea informatiilor din intrarea text

        nickname = intrareNickname.getText();

 

        // Tratarea actionarilor asociate introducerii numelui

        System.out.println("A fost introdus numele utilizatorului: " + nickname);

 

        // Dezactivarea posibilitatii de modificare a numelui de utilizator

        intrareNickname.setEditable(false);

        butonConfirmareNickname.setEnabled(false);

 

        nicknameIntrodus = true;

      }

 

      if (numeIntrodus && prenumeIntrodus && nicknameIntrodus) {

        setTitle("Va numiti " + nume + prenume + " (alias " + nickname + ")");

      }

    }     

  };

  /**

   * Metoda principala

   */

  public static void main(java.lang.String[] args) {

    new SurseMultiple();

  }

}

 

GUI.2.6. Surse multiple de evenimente multiple

 

 

Programul SurseSiAscultatoriMultipli ilustreaza tratarea evenimentelor generate de surse (componente grafice Swing) multiple catre mai multi ascultatori de evenimente (script pentru compilarea si executia lui).

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

00

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

import javax.swing.event.*;

import javax.swing.text.*;

 

/**

 *  Ilustreaza surse multiple de evenimente si ascultatori multipli ai

 *  evenimentelor

 */

public class SurseSiAscultatoriMultipli extends JFrame {

  private JTextField intrareInformatie;

  private JButton butonConfirmareInformatie;

  private String informatie;

 

  /**

   * Initializeaza obiectul de tip SurseSiAscultatoriMultipli

   */

  public SurseSiAscultatoriMultipli() {

    // Apel al constructorului supraclasei (JFrame) pentru stabilirea titlului

    super ("Surse multiple si ascultatori multipli");

 

    // Containerul ferestrei grafice

    Container containerFereastra = this.getContentPane();

 

    // Stabilirea modului de asezare a componentelor in fereastra (layoutului)

    containerFereastra.setLayout(new FlowLayout());

 

    // Camp de text pentru introducerea informatiei

    intrareInformatie = new JTextField(20);

    containerFereastra.add(intrareInformatie);

 

    // Buton pentru confirmarea introducerii informatiei

    butonConfirmareInformatie = new JButton("Informatie");

    containerFereastra.add(butonConfirmareInformatie);

 

    // Inregistrarea "ascultatorilor" de "evenimente actionare" 

    // Buton (actionare = click pe buton)

    butonConfirmareInformatie.addActionListener(ascultatorEvenimenteActionare);

 

    // Intrare grafica de text (actionare = apasare <Enter>)

    intrareInformatie.addActionListener(ascultatorEvenimenteActionare);

 

    // Inregistrarea "ascultatorilor" de "evenimente document" 

    // Intrare grafica de text (inserare, eliminare)

    intrareInformatie.getDocument().addDocumentListener(ascultatorDocument);

 

    // Inregistrarea "ascultatorului" de "evenimente fereastra"

    this.addWindowListener(ascultatorInchidere);

 

    // Impachetarea (compactarea) componentelor in container

    pack();                         

    // Fereastra devine vizibila - echivalent cu frame.setVisible(true)

    show();                     

  }

 

 

 

 

 

  /**

    * Crearea unui "ascultator" de "evenimente document"

    * Obiect al unei clase "anonime" care implementeaza interfata DocumentListener

    */

  DocumentListener ascultatorDocument = new DocumentListener() {

    // Tratarea evenimentului inserare in document

    public void insertUpdate(DocumentEvent ev) {

      Document doc = (Document)ev.getDocument();

      int numarCaractere = ev.getLength();

      System.out.println(numarCaractere + " caracter" +

            ((numarCaractere == 1) ? " a " : "e au ") +

            "fost adaugat" + ((numarCaractere == 1) ? " " : "e ") +

            "la document.\n" +

            "  Lungimea textului = " + doc.getLength() + "\n");

    }

    // Tratarea evenimentului eliminare din document

    public void removeUpdate(DocumentEvent ev) {

      Document doc = (Document)ev.getDocument();

      int numarCaractere = ev.getLength();

      System.out.println(numarCaractere + " caracter" +

            ((numarCaractere == 1) ? " a " : "e au ") +

            "fost eliminat" + ((numarCaractere == 1) ? " " : "e ") +

            "din document.\n" +

            "  Lungimea textului = " + doc.getLength() + "\n");

    }

    //Documentele text nu pot genera aceste evenimente

    public void changedUpdate(DocumentEvent ev) {

    }

  };

  /**

    * Crearea unui "adaptor pentru ascultator" de "evenimente fereastra"

    * Obiect al unei clase "anonime" care extinde clasa WindowAdapter

    */

  WindowAdapter ascultatorInchidere = new WindowAdapter() {

    /**

      * Tratarea inchiderii ferestrei curente

      */

    public void windowClosing(WindowEvent ev) {

      // Terminarea programului

      System.exit(0);                                   

    }

  };

  /**

    * Crearea unui "ascultator" de "evenimente actionare"

    * Obiect al unei clase "anonime" care implementeaza interfata ActionListener

    */

  ActionListener ascultatorEvenimenteActionare = new ActionListener() {

    // Tratarea evenimentului actionare pentru ascultatorii inregistrati

    public void actionPerformed(ActionEvent ev) {

 

      // Eveniment legat de introducerea informatiei

      if ((ev.getSource() == butonConfirmareInformatie) ||

          (ev.getSource() == intrareInformatie)) {

 

        // Culegerea informatiilor din intrarea text

        informatie = intrareInformatie.getText();

 

        // Tratarea actionarilor asociate introducerii numelui

        System.out.println("A fost introdusa informatia: " + informatie);

 

        // Dezactivarea posibilitatii de modificare a numelui

        intrareInformatie.setEditable(false);

        butonConfirmareInformatie.setEnabled(false);

      }

    }     

  };

  /**

   * Metoda principala

   */

  public static void main(java.lang.String[] args) {

    new SurseSiAscultatoriMultipli();

  }

}


 

GUI.2.7. Alte componente grafice Swing

 

1. Intrare text pentru parole

 

Programul PasswordDemo si un script pentru compilarea si executia lui.

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

  import javax.swing.*;

  import java.awt.*;

  import java.awt.event.*;

 

  public class PasswordDemo {

    private static boolean isPasswordCorrect(char[] input) {

      char[] correctPassword = { 'g', 'h', 'i', 'c', 'i' };

      if (input.length != correctPassword.length)

        return false;

      for (int i = 0;  i < input.length; i ++)

        if (input[i] != correctPassword[i])

          return false;

      return true;

    }

 

    public static void main(String[] argv) {

      final JFrame f = new JFrame("PasswordDemo");

      JLabel label = new JLabel("Introduceti parola: ");

 

      JPasswordField passwordField = new JPasswordField(10);

 

      passwordField.setEchoChar('#');

 

      // Tratarea actionarii intrarii

      passwordField.addActionListener(new ActionListener() {

        public void actionPerformed(ActionEvent e) {

 

          JPasswordField input = (JPasswordField)e.getSource();

 

          char[] password = input.getPassword();

 

          if (isPasswordCorrect(password)) {

            JOptionPane.showMessageDialog(f, "Succes! Password corect.");

          }

          else {

            JOptionPane.showMessageDialog(f, "Password incorect. Mai incearca.",

                        "Error Message", JOptionPane.ERROR_MESSAGE);

          }

        }

      });

 

      JPanel contentPane = new JPanel(new BorderLayout());

      contentPane.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));

      contentPane.add(label, BorderLayout.WEST);

      contentPane.add(passwordField, BorderLayout.CENTER);

 

      f.setContentPane(contentPane);

      f.addWindowListener(new WindowAdapter() {

        public void windowClosing(WindowEvent e) { System.exit(0); }

      });

      f.pack();

      f.setVisible(true);

    }

}

 

Fereastrele obtinute prin executia programului PasswordDemo.java:

 

    

 

    

 

2. Butoane radio (RadioButton)

 

Programul RadioButtonDemo si un script pentru compilarea si executia lui.

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

 

public class RadioButtonDemo extends JPanel {

    static JFrame frame;

 

    static String birdString = "Bird";

    static String catString = "Cat";

    static String dogString = "Dog";

    static String rabbitString = "Rabbit";

    static String pigString = "Pig";

 

    JLabel picture;

 

    public RadioButtonDemo() {

        // Create the radio buttons.

        JRadioButton birdButton = new JRadioButton(birdString);

        birdButton.setMnemonic(KeyEvent.VK_B);

        birdButton.setActionCommand(birdString);

        birdButton.setSelected(true);

 

        JRadioButton catButton = new JRadioButton(catString);

        catButton.setMnemonic(KeyEvent.VK_C);

        catButton.setActionCommand(catString);

 

        JRadioButton dogButton = new JRadioButton(dogString);

        dogButton.setMnemonic(KeyEvent.VK_D);

        dogButton.setActionCommand(dogString);

 

        JRadioButton rabbitButton = new JRadioButton(rabbitString);

        rabbitButton.setMnemonic(KeyEvent.VK_R);

        rabbitButton.setActionCommand(rabbitString);

 

        JRadioButton pigButton = new JRadioButton(pigString);

        pigButton.setMnemonic(KeyEvent.VK_P);

        pigButton.setActionCommand(pigString);

 

        // Group the radio buttons.

        ButtonGroup group = new ButtonGroup();

        group.add(birdButton);

        group.add(catButton);

        group.add(dogButton);

        group.add(rabbitButton);

        group.add(pigButton);

 

        // Register a listener for the radio buttons.

        RadioListener myListener = new RadioListener();

        birdButton.addActionListener(myListener);

        catButton.addActionListener(myListener);

        dogButton.addActionListener(myListener);

        rabbitButton.addActionListener(myListener);

        pigButton.addActionListener(myListener);

 

        // Set up the picture label

        picture = new JLabel(new ImageIcon("images/"

                                           + birdString

                                           + ".gif"));

        // The preferred size is hard-coded to be the width of the

        // widest image and the height of the tallest image.

        // A real program would compute this.

        picture.setPreferredSize(new Dimension(177, 122));

 

 

        // Put the radio buttons in a column in a panel

        JPanel radioPanel = new JPanel();

        radioPanel.setLayout(new GridLayout(0, 1));

        radioPanel.add(birdButton);

        radioPanel.add(catButton);

        radioPanel.add(dogButton);

        radioPanel.add(rabbitButton);

        radioPanel.add(pigButton);

 

        setLayout(new BorderLayout());

        add(radioPanel, BorderLayout.WEST);

        add(picture, BorderLayout.CENTER);

        setBorder(BorderFactory.createEmptyBorder(20,20,20,20));

    }

 

    /** Listens to the radio buttons. */

    class RadioListener implements ActionListener {

        public void actionPerformed(ActionEvent e) {

            picture.setIcon(new ImageIcon("images/"

                                          + e.getActionCommand()

                                          + ".gif"));

        }

    }

    public static void main(String s[]) {

         frame = new JFrame("RadioButtonDemo");

         frame.addWindowListener(new WindowAdapter() {

             public void windowClosing(WindowEvent e) {System.exit(0);}

         });

 

         frame.getContentPane().add(new RadioButtonDemo(), BorderLayout.CENTER);

         frame.pack();

         frame.setVisible(true);

    }

}

 

 

Fereastrele obtinute prin executia programului RadioButtonDemo.java:

 

    

 

 

3. Cutie de optiuni (CheckBox)

 

Programul CheckBoxDemo si un script pentru compilarea si executia lui.

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

00

01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

 

public class CheckBoxDemo extends JPanel {

    JCheckBox chinButton;

    JCheckBox glassesButton;

    JCheckBox hairButton;

    JCheckBox teethButton;

    /*

     * Four accessory choices provide for 16 different

     * combinations. The image for each combination is

     * contained in a separate image file whose name indicates

     * the accessories. The filenames are "geek-XXXX.gif"

     * where XXXX can be one of the following 16 choices.

     * The "choices" StringBuffer contains the string that

     * indicates the current selection and is used to generate

     * the file name of the image to display.

     

       ----             // zero accessories

     

       c---             // one accessory

       -g--

       --h-

       ---t

     

       cg--             // two accessories

       c-h-

       c--t

       -gh-

       -g-t

       --ht

     

       -ght             // three accessories

       c-ht

       cg-t

       cgh-

     

       cght             // all accessories

     */

 

    StringBuffer choices;

    JLabel pictureLabel;

 

    public CheckBoxDemo() {

        // Create the check boxes

        chinButton = new JCheckBox("Chin");

        chinButton.setMnemonic(KeyEvent.VK_C);

        chinButton.setSelected(true);

 

        glassesButton = new JCheckBox("Glasses");

        glassesButton.setMnemonic(KeyEvent.VK_G);

        glassesButton.setSelected(true);

 

        hairButton = new JCheckBox("Hair");

        hairButton.setMnemonic(KeyEvent.VK_H);

        hairButton.setSelected(true);

 

        teethButton = new JCheckBox("Teeth");

        teethButton.setMnemonic(KeyEvent.VK_T);

        teethButton.setSelected(true);

 

        // Register a listener for the check boxes.

        CheckBoxListener myListener = new CheckBoxListener();

        chinButton.addItemListener(myListener);

        glassesButton.addItemListener(myListener);

        hairButton.addItemListener(myListener);

        teethButton.addItemListener(myListener);

 

        // Indicates what's on the geek.

        choices = new StringBuffer("cght");

 

        // Set up the picture label

        pictureLabel = new JLabel(new ImageIcon(

                                        "images/geek/geek-"

                                         + choices.toString()

                                         + ".gif"));

        pictureLabel.setToolTipText(choices.toString());

 

        // Put the check boxes in a column in a panel

        JPanel checkPanel = new JPanel();

        checkPanel.setLayout(new GridLayout(0, 1));

        checkPanel.add(chinButton);

        checkPanel.add(glassesButton);

        checkPanel.add(hairButton);

        checkPanel.add(teethButton);

 

        setLayout(new BorderLayout());

        add(checkPanel, BorderLayout.WEST);

        add(pictureLabel, BorderLayout.CENTER);

        setBorder(BorderFactory.createEmptyBorder(20,20,20,20));

    }

 

    /** Listens to the check boxes. */

    class CheckBoxListener implements ItemListener {

        public void itemStateChanged(ItemEvent e) {

            int index = 0;

            char c = '-';

            Object source = e.getItemSelectable();

 

            if (source == chinButton) {

                index = 0;

                c = 'c';

            } else if (source == glassesButton) {

                index = 1;

                c = 'g';

            } else if (source == hairButton) {

                index = 2;

                c = 'h';

            } else if (source == teethButton) {

                index = 3;

                c = 't';

            }

 

            if (e.getStateChange() == ItemEvent.DESELECTED)

                c = '-';

            choices.setCharAt(index, c);

            pictureLabel.setIcon(new ImageIcon(

                                        "images/geek/geek-"

                                        + choices.toString()

                                        + ".gif"));

            pictureLabel.setToolTipText(choices.toString());

        }

    }

 

    public static void main(String s[]) {

         JFrame frame = new JFrame("CheckBoxDemo");

         frame.addWindowListener(new WindowAdapter() {

             public void windowClosing(WindowEvent e) {

                 System.exit(0);

             }

         });

 

         frame.setContentPane(new CheckBoxDemo());

         frame.pack();

         frame.setVisible(true);

    }

}

 

 

Fereastrele obtinute prin executia programului CheckBoxDemo.java:

 

    

 

 

 

GUI.3. Introducere in applet-uri Java

 

GUI.3.1. Caracteristicile applet-urilor Java

 

Applet-urile sau miniaplicatiile Java sunt portiuni de cod Java care mostenesc clasa Applet.

Prin plasarea lor in browser-e, applet-urile devin panouri frontale ale serviciilor distribuite oferite de Web.

Applet-urile sunt mai intai incarcate in browser-e, fiind apoi executate in mediul de executie oferit de acesta.

Applet-urile nu sunt aplicatii complete, ci componente care ruleaza in mediul browser-ului.

Browser-ul actioneaza ca un framework pentru executia applet-urile (componentelor Java).

Browser-ul informeaza applet-ul asupra evenimentelor care se petrec pe durata de viata a applet-ului.

Serviciile oferite de browser sunt:

GUI.3.2. Ciclul de viata al applet-urilor Java                                  

 

Clasa Applet interfata Runnable definesc metode pe care un browser le poate invoca pe durata ciclului de viata al unui applet.

Browser-ul invoca:

Invocarea ultimelor doua metode conduce la "omorarea" tuturor firelor de executie ale applet-ului si la eliberarea tuturor resurselor applet-ului.

Urmatorul applet simplu:

import java.applet.Applet;
import java.awt.Graphics;

public class Simple extends Applet {

    StringBuffer buffer;

    public void init() {
        buffer = new StringBuffer();
        addItem("initializing... ");
    }

    public void start() {
        addItem("starting... ");
    }

    public void stop() {
        addItem("stopping... ");
    }

    public void destroy() {
        addItem("preparing for unloading...");
    }

    void addItem(String newWord) {
        System.out.println(newWord);
        buffer.append(newWord);
        repaint();
    }

    public void paint(Graphics g) {
        //Draw a Rectangle around the applet's display area.
        g.drawRect(0, 0, size().width - 1, size().height - 1);

        //Draw the current string inside the rectangle.
        g.drawString(buffer.toString(), 5, 15);
    }
}

permite, prin vizualizarea lui, urmarirea fazelor ciclului de viata ale unui applet.

Pentru a avea interactivitate avansata, applet-ul trebuie sa implementeze metoda run() a interfetei Runnable sau metoda run() a clasei Thread, care se executa in interiorul unui fir de executie (thread). 

GUI.3.3. Crearea unui applet Java                                  

 

Miniaplicatia FirstApplet foloseste componentele multimedia integrate ale limbajului Java pentru afisarea unei imagini si redarea unui fisier de sunet.


import java.awt.*;
import java.applet.*;

public class FirstApplet extends Applet {

Image NewImage;

public void init() {
  resize(400,400);
  NewImage = getImage(getCodeBase(),”New.gif”);
}

public void paint(Graphics g) {
  g.drawString(“Hello!”);
  g.drawImage(NewImage,0,0,this);
  play(getCodeBase(),”New.au”);
}

}

Instructiunea import permite miniaplicatiei sa foloseasca metode si clase din alte pachete:

import java.awt.*;
import java.applet.*;

 

In mod prestabilit, toate programele Java importa pachetul java.lang, care contine functiile de baza ale limbajului Java. Asteriscul de la sfarsitul instructiunii import permite importul dinamic al claselor Java. In acest exemplu, sunt importate dinamic clasele din pachetele java.awt si java.applet.

Linia urmatoare declara o clasa numita FirstApplet care extinde clasa Applet:

     public class FirstApplet extends Applet {

Prin extinderea clasei Applet, FirstApplet mosteneste functionalitatea acestei clase. Acolada deschisa marcheaza inceputul clasei FirstApplet.

Linia urmatoare initializeaza variabila NewImage si o declara de a fi de tipul Image. In acest caz, NewImage are rolul unui substituent al imaginii care va fi afisata:

Image NewImage;

Linia urmatoare declara o metoda numita init(), care redefineste metoda init() a clasei Applet:

     public void init() {

Metoda init() a clasei Applet este redefinita, astfel incat sa puteti redimensiona fereastra inainte de afisarea imaginii. Modificatorul public specifica faptul ca metoda este accesibila altor clase. Modificatorul void specifica faptul ca metoda nu returneaza nici o valoare. In mod normal, argumentele acceptate de o metoda sunt incadrate de paranteze rotunde. Deoarece metoda init() nu accepta argumente, intre paranteze nu apare nimic.

Folosind metoda resize(), puteti sa redimensionati zona de afisare a miniaplicatiei. In acest exemplu, dimensiunea zonei de afisare este stabilita la 400x400 pixeli:

   resize(400,400);

Dupa ce ati declarat o variabila de un anumit tip, puteti sa o folositi. Linia urmatoare stabileste o valoare pentru variabila NewImage;

     NewImage = getImage(getCodeBase(), ”New.gif”);

Pentru aceasta, este folosita metoda getImage( ). Primul argument al metodei este un apel al metodei getCodeBase(), care returneaza pozitia directorului de baza sau a directorului curent de pe hard-disc. Directorul de baza este directorul care contine fisierul clasei pe care o rulati. Al doilea argument este numele imaginii care poate fi gasita in pozitia specificata.

Urmatoarea linie de cod declara o metoda numita paint( ), care redefineste metoda paint( ) din pachetul AWT:

     public void paint (Graphics g) {

Metoda paint( ) este redefinita pentru a permite miniaplicatiei sa afiseze imaginea intr-o anumita pozitie pe ecran. Modificatorul public specifica faptul ca metoda este accesibila altor clase. Modificatorul void specifica faptul ca metoda nu returneaza nici o valoare. La apelarea metodei paint( ), trebuie sa folositi ca parametru un obiect al clasei Graphics.

Graphics este o clasa de baza abstracta pentru toate obiectele grafice. Elementul g reprezinta fereastra de tip Graphics specificata.

Linia urmatoare apeleaza obiectul g, de tip Graphics, pentru afisarea imaginii NewImage:

     g.drawImage(NewImage,0,0,this);

Metoda care realizeaza de fapt operatiunea se numeste drawImage( ). Metoda drawImage( ) accepta argumente prin care i se precizeaza ce imagine trebuie sa afiseze si unde. In acest exemplu, obiectul NewImage este afisat in punctul de coordonate 0,0. Ultimul argument al metodei se numeste observator. Scopul acestuia este sa verifice daca imaginea a fost afisata integral.

Asa cum sugereaza si numele sau metoda play( ) este folosita pentru redarea fisierelor de sunet. Primul argument al metodei play( ) este un apel al metodei getCodeBase(), care returneaza pozitia directorului de baza sau a directorului curent de pe hard-disc.

     play(getCodeBase(), ”New.au”);

Directorul de baza este directorul care contine fisierul clasei pe care o rulati. Al doilea argument este numele fisierului de sunet care poate fi gasit in pozitia specificata.

Crearea miniaplicatiei

Trebuie sa stocati programul FirstApplet intr-un fisier numit FirstApplet.java. Acesta va fi salvat ca fisier de text ASCII standard.

Compilarea miniaplicatiei FirstApplet

Compilarea unei miniaplicatii se realizeaza la fel cu compilarea unei aplicatii. Pentru compilarea miniaplicatiei FirstApplet, folositi compilatorul Java, javac. La compilarea unui fisier sursa, compilatorul creeaza un fisier separat pentru fiecare clasa din program. Daca miniaplicatia are mai multe fisiere de clasa, trebuie sa apelati interpretorul Java cu numele clasei care contine metoda primara. Deoarece FirstApplet contine o singura declaratie de clasa, compilatorul Java va crea un singur fisier.

Crearea unui fisier HTML pentru miniaplicatie

Deorece miniaplicatiile pot fi vizualizate cu ajutorul unor programe hypertext specializate, cum ar fi browserele Web, trebuie sa creati un document HTML inainte de a putea utiliza miniaplicatia. In cadrul acestui document, pentru incarcarea si rularea miniaplicatiei specificate, folositi o eticheta de marcare numita APPLET. In eticheta <APPLET> se face referire la clasele Java, nu la fisierele de clasa care se termina cu extensia .class. Exemplul de document HTML de mai jos contine o eticheta <APPLET> care se refera la clasa FirstApplet, si nu la fisierul numit FirstApplet.class.

Cu ajutorul unui editor sau al unui procesor de texte, creati un fisier de text ASCII standard, cu urmatorul continut:

    <HTML>
    <HEAD>
    <TITLE>First Java Applet</TITLE>
    </HEAD>
    <BODY>
    <APPLET CODE=”FirstApplet” width=400 height=400></APPLET>
    </BODY>
    </HTML>

Salvati acest fisier in acelasi director cu codul compilat al programului FirstApplet. Majoritatea documentelor HTML folosesc extensia .html; ar trebui sa salvati fisierul sub un nume corespunzator, cum ar fi example.html.

Rularea miniaplicatiei FirstApplet

Dupa crearea fisierelor necesare pentru programul FirstApplet, puteti rula miniaplicatia cu ajutorul unui program de vizualizare a hypertextului. Setul de dezvoltare Java contine un astfel de program, numit appletviewer. In anumite sisteme, programul appletviewer este un instrument de lucru din linia de comanda si poate fi apelat cu numele clasei pe care vreti sa o rulati (script pentru lansarea fisierului HTML si implicit a applet-ului in programul appletviewer).