Java : Applet avec objets Swing
JTextArea et JTextField

Objectif : Nous utilisons dans l'applet un objet de classe  JTextField, un objet de classe  JTextArea, un objet de classe  JButton, deux objets JCheckbox. Notre applet doit rajouter dans le JTextArea l'élément entré par le clavier dans le JTextField (le click sur le JButton déclenchant la recopie). Nous voulons enfin, que les JCheckbox servent à rendre le bouton de copie visible ou invisble afin d'autoriser ou d'interdire la copie.
 

Travail à exécuter en Java

On vous donne le squelette général de l'applet en vous indiquant que le  JButton doit posséder un écouteur sur l'événement actionPerformed (sensible au click de souris), chaque JCheckbox doit posséder un écouteur sur l'événement itemStateChanged (la case a changé d'état cochée/décochée). Les deux JCheckbox seront associé à un même objet de groupe (classe ButtonGroup) afin de s'exclure mutuellement.

Le texte contenu dans le JTextField doit être sélectionné au départ et à chaque fois que l'applet est redessinée. Le focus doit être mis sur le JTextField  dès que le bouton de copie a été cliqué ceci afin que l'utilisateur revienne automatiquement taper son texte dans le JTextField.

Squelette de l'applet à compléter :
import java.awt.*;
import java.awt.event.*;
import java.applet.*;
import javax.swing.*;

Démarrage
pour comparaison, le code de la version Awt est mentionné après le code Swing
état de l'applet Swing au départ code java Swing correspondant
this.getContentPane().setLayout(null);
jScrollPane1.setBounds(13, 12, 131, 119);
jCheckBox1.setText("copie activée");
jCheckBox1.setSelected(true);
jCheckBox1.setBounds(172, 16, 141, 16);
jCheckBox2.setText("copie desactivée");
jCheckBox2.setBounds(171, 51, 145, 17);
jTextField1.setText("entrez le texte à copier");
jTextField1.setBounds(16, 143, 268, 23);
jButton1.setText("copier");
jButton1.setBounds(90, 179, 128, 30);
this.getContentPane().add(jScrollPane1);
this.getContentPane().add(jCheckBox1);
this.getContentPane().add(jCheckBox2);
this.getContentPane().add(jTextField1);
this.getContentPane().add(jButton1);
jScrollPane1.getViewport().add(jTextArea1);
buttonGroup1.add(jCheckBox1);
buttonGroup1.add(jCheckBox2);
état de l'applet Awt au départ code java Awt correspondant
this.setLayout(null);
textArea1.setBounds(13, 16, 177, 115);
textField1.setText("entrez le texte à copier");
textField1.setBounds(10, 152, 243, 23);
button1.setLabel("copier");
button1.setBounds(59, 197, 178, 32);    checkbox1.setCheckboxGroup(checkboxGroup1);
checkbox1.setLabel("copie activée");
checkbox1.setState(true);
checkbox1.setBounds(197, 31, 103, 25);
 checkbox2.setCheckboxGroup(checkboxGroup1);
checkbox2.setLabel("copie desactivée");
checkbox2.setBounds(198, 72, 115, 16);
this.add(button1);
this.add(textArea1);
this.add(textField1);
this.add(checkbox2);
this.add(checkbox1);

 

Click sur Button "copier"
pour comparaison, le code de la version Awt est mentionné après le code Swing
état de l'applet Swing après un click sur le bouton
une fois qu'un texte a été entré dans le TextField
code java Swing correspondant
au click sur le bouton : ajout au TextArea du texte entré dans le TextField
On ajoute le texte entré à la suite du texte déjà présent dans le JTextArea :
jTextArea1.append( jTextField1.getText( )+"\n" );

On redonne la focalisation (pour les entrées clavier) au JTextField :
jTextField1.requestFocus( );

état de l'applet Awt après un click sur le bouton
une fois qu'un texte a été entré dans le TextField
code java Awt correspondant
au click sur le bouton : ajout au TextArea du texte entré dans le TextField

On ajoute le texte entré à la suite du texte déjà présent dans le TextArea :
textArea1.append( textField1.getText( )+"\n" );

On redonne la focalisation (pour les entrées clavier) au TextField :
textField1.requestFocus( );

Après un redissenement de l'applet
pour comparaison, le code de la version Awt est mentionné après le code Swing
état de l'applet Swing après que soit sa taille ait été modifiée, soit l'applet ait été masqué etc... code java Swing
Après chaque redessinement de l'applet

- on surligne (sélectionne) le texte du TextField :
jTextField1.setSelectionStart(0);
jTextField1.setSelectionEnd( jTextField1.getText( ).length() );

- on donne la focalisation au TextField : 
 jTextField1.requestFocus();

 

état de l'applet Awt après que soit sa taille ait été modifiée, soit l'applet ait été masqué etc... code java Awt
Après chaque redessinement de l'applet

- on surligne (sélectionne) le texte du TextField :
textField1.setSelectionStart(0);
textField1.setSelectionEnd( textField1.getText( ).length( ));

- on donne la focalisation au TextField : 
 textField1.requestFocus();

Click sur une des cases à cocher
pour comparaison, le code de la version Awt est mentionné après le code Swing
état de l'applet Swing après un click sur la case "copie désactivée" (le bouton devient invisible) code java Swing
On teste les informations contenues dans l'objet "e" de classe ItemEvent afin de connaître le genre de changement d'état qui vient de se produire sur la case à cocher.

pour la case à cocher "copie activée" :
 if ( e.getStateChange( ) == ItemEvent.SELECTED )
            jButton1.setVisible(true);

pour la case à cocher "copie désactivée" :
 if ( e.getStateChange( ) == ItemEvent.SELECTED )
            jButton1.setVisible(false);

pour mettre les cases dans le même groupe :
ButtonGroup buttonGroup1 = new ButtonGroup();
buttonGroup1.add(jCheckBox1);
buttonGroup1.add(jCheckBox2);

pour la sélection du texte dans le TextField :
jTextField1.setSelectionStart(0);
jTextField1.setSelectionEnd( jTextField1.getText( ).length() );

état de l'applet Awt après un click sur la case "copie désactivée" (le bouton devient invisible) code java Awt
On teste les informations contenues dans l'objet "e" de classe ItemEvent afin de connaître le genre de changement d'état qui vient de se produire sur la case à cocher.

pour la case à cocher "copie activée" :
 if ( e.getStateChange( ) == ItemEvent.SELECTED )
            button1.setVisible(true);

pour la case à cocher "copie désactivée" :
 if ( e.getStateChange( ) == ItemEvent.SELECTED )
            button1.setVisible(false);

pour mettre les cases dans le même groupe :
checkbox1.setCheckboxGroup(checkboxGroup1);
checkbox2.setCheckboxGroup(checkboxGroup1);

pour la sélection du texte dans le TextField :
textField1.setSelectionStart(0);
textField1.setSelectionEnd( textField1.getText( ).length( ) );

 

Construisez en recombinant les lignes de code Swing proposées, un programme complet d'applet correct.
 

Remonter 



 

2 - Proposition de solution Java :

Le code java de l'applet :
 

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

public class Applet_JTextArea extends JApplet {
  JScrollPane jScrollPane1 = new JScrollPane();
  JTextArea jTextArea1 = new JTextArea();
  JCheckBox jCheckBox1 = new JCheckBox();
  JCheckBox jCheckBox2 = new JCheckBox();
  JTextField jTextField1 = new JTextField();
  JButton jButton1 = new JButton();
  ButtonGroup buttonGroup1 = new ButtonGroup();

  public void init() {
    this.setSize(321, 228);
    this.getContentPane().setLayout(null);
    jScrollPane1.setBounds(13, 12, 131, 119);
    jCheckBox1.setText("copie activée");
    jCheckBox1.setSelected(true);
    jCheckBox1.setBounds(172, 16, 141, 16);
    jCheckBox1.addItemListener(new java.awt.event.ItemListener() {
      public void itemStateChanged(ItemEvent e) {
        jCheckBox1_itemStateChanged(e);
      }
    });
    jCheckBox2.setText("copie desactivée");
    jCheckBox2.setBounds(171, 51, 145, 17);
    jCheckBox2.addItemListener(new java.awt.event.ItemListener() {
      public void itemStateChanged(ItemEvent e) {
        jCheckBox2_itemStateChanged(e);
      }
    });
    jTextField1.setText("entrez le texte à copier");
    jTextField1.setBounds(16, 143, 268, 23);
    jButton1.setText("copier");
    jButton1.setBounds(90, 179, 128, 30);
    jButton1.addActionListener(new java.awt.event.ActionListener() {
      public void actionPerformed(ActionEvent e) {
        jButton1_actionPerformed(e);
      }
    });
    this.getContentPane().add(jScrollPane1);
    this.getContentPane().add(jCheckBox1);
    this.getContentPane().add(jCheckBox2);
    this.getContentPane().add(jTextField1);
    this.getContentPane().add(jButton1);
    jScrollPane1.getViewport().add(jTextArea1);
    buttonGroup1.add(jCheckBox1);
    buttonGroup1.add(jCheckBox2);
  }
  void jButton1_actionPerformed(ActionEvent e) {
   /*après le click sur le bouton le jTextField1 possède
          la focalisation */
   jTextArea1.append(jTextField1.getText()+"\n");
   jTextField1.requestFocus();
  }
  void jCheckBox1_itemStateChanged(ItemEvent e) {
  // lorsque cette case est sélectionnée le bouton apparaît
    if (e.getStateChange()==ItemEvent.SELECTED)
                  jButton1.setVisible(true);
    this.repaint( );
  }
  void jCheckBox2_itemStateChanged(ItemEvent e) {
  // lorsque cette case est sélectionnée le bouton disparaît
   if (e.getStateChange()==ItemEvent.SELECTED)
                  jButton1.setVisible(false);
  }
  public void paint(Graphics x){
          /* à chaque redessinement le texte du jTextField1 est sélectionné
             et le jTextField1 possède la focalisation
          */
    super.paint(x);
    jTextField1.requestFocus( );
    jTextField1.setSelectionStart(0);
    jTextField1.setSelectionEnd(jTextField1.getText().length( ));
  }
}
 

Recommandation pour affichage Swing
public void paint ( Graphics x ) {
 super.paint(x);
 ...............
}

A la place de la surcharge de la méthode paint de JApplet et de l'appel au paint du parent (ici la classe parent d'une JApplet est la classe Applet) comme dans l'exemple précédent, le JDK recommande de plutôt d'utiliser la méthode "protected void paintComponent(Graphics g)" de la classe JComponent.

Pour plus d'informations reportez-vous au cours "Applet avec des swing\affichage Awt-Swing".
 

Le code HTML de la page appelant l'applet :
 

<HTML>
    <HEAD>
          <TITLE> Applet-Bonjour </TITLE>
    </HEAD>
    <BODY>
        <p>Sortie de l'Applet-Bonjour :</p>
        <APPLET CODE="Applet_JTextArea.class" WIDTH=400 HEIGHT=200>
        </APPLET>
     </BODY>
</HTML>

Remonter