Création interface graphique avec Swing : les bases


précédentsommairesuivant

6. Demander du texte à l'utilisateur

Maintenant que vous savez afficher du texte à l'écran et employer des boutons pour créer un événement, on va apprendre à demander à l'utilisateur du texte. Pour cela, il existe plusieurs composants :

  • Le JTextField : C'est le plus simple des composants textes. Il permet d'entrer un texte sur une seule ligne.
  • Le JTextArea : Il permet d'entrer un texte complet sur plusieurs lignes.
  • Le JEditorPane : Très complet, vous pouvez modifier la police, la taille, la couleur de votre texte. Il permet même d'afficher des pages html. Vous pouvez y insérer du texte et des images.
  • Le JTextPane : C'est le composant texte le plus évolué de Swing. Il permet la même chose que le JEditorPane mais il permet également d'insérer des composant personnalisés, c'est-àire que vous pouvez y insérer des composants Swing.

On ne va pas s'étendre sur les 3 derniers dans cet article, car cela dépasserait le cadre de celui-ci. J'essayerai de faire un article dédié pour les composants textes pour compléter celui-ci.

Nous allons maintenant apprendre à utiliser un JTextField.

6.1. Utilisation d'un JTextField

On va reprendre la base des autres fenêtres. Un JTextField s'utilise comme un autre composant, on utilise donc la même manière pour l'insérer dans une page. On va donc commencer par ajouter un JTextField dans une fenêtre :

 
Sélectionnez
//...
import javax.swing.JButton;
 
public class FenetreSaisie extends JFrame {
 
	//...
 
	private JPanel buildContentPane(){
		JPanel panel = new JPanel();
		panel.setLayout(new FlowLayout());
 
		JTextField textField = new JTextField();
		textField.setColumns(10); //On lui donne un nombre de colonnes à afficher
 
		panel.add(textField);
 
		return panel;
	}
}

Si vous voulez mettre un texte par défaut dans le JTextField, il suffit de passer une chaîne de caractères au constructeur ou alors d'utiliser la méthode setText pour lui donner un texte.

Ce qui devrait vous donner :

Fenêtre de saisie
Fenêtre de saisie

Vous pouvez donc écrire du texte dans le JTextField. On va maintenant ajouter un bouton à notre fenêtre. Ce bouton va récupérer le texte dans le JTextField et l'afficher dans un JLabel qu'on va aussi ajouter à l'interface.

Un problème va maintenant se poser. On va devoir faire une nouvelle classe Action pour notre bouton alors comment récupérer la valeur du JTextField et modifier la valeur du JLabel ? Dans une application de cette taille, la meilleure solution est d'ajouter des accesseurs sur notre classe d'interface et passer une référence de cette classe à notre action.

On va commencer par modifier notre interface pour ajouter un label et pour pouvoir accéder aux deux composants depuis une autre classe :

 
Sélectionnez
//...
import javax.swing.JButton;
 
public class FenetreSaisie extends JFrame {
	private JTextField textField;
	private JLabel label;
 
	//...
 
	private JPanel buildContentPane(){
		JPanel panel = new JPanel();
		panel.setLayout(new FlowLayout());
 
		textField = new JTextField();
 
		panel.add(textField);
 
		label = new JLabel("Rien pour le moment");
 
		panel.add(label);
 
		return panel;
	}
 
	public JTextField getTextField(){
		return textField;
	}
 
	public JLabel getLabel(){
		return label;
	}
}

Il serait tentant de juste mettre le modificateur d'accès à public pour nos deux champs pour générer moins de code, mais ceci est à proscrire. Il faut limiter le plus possible les attributs publics d'une classe.

Ensuite, on va créer notre GetAction :

 
Sélectionnez
public class GetAction extends AbstractAction {
	private FenetreSaisie fenetre;
 
	public GetAction(FenetreSaisie fenetre, String texte){
		super(texte);
 
		this.fenetre = fenetre;
	}
 
	public void actionPerformed(ActionEvent e) { 
		String texteUtilisateur = fenetre.getTextField().getText();
		fenetre.getLabel().setText(texteUtilisateur);
	} 
}

Rien de bien compliqué donc. On passe une référence de la fenêtre au constructeur de l'action et on utilise ensuite cette référence dans la méthode actionPerformed pour récupérer le texte dans le JTextField avec getText() et modifier le texte du JLabel avec setText().

On va maintenant ajouter notre bouton à notre interface :

 
Sélectionnez
//...
 
public class FenetreSaisie extends JFrame {
	//...
 
	private JPanel buildContentPane(){
		JPanel panel = new JPane();
		panel.setLayout(new FlowLayout());
 
		textField = new JTextField();
 
		panel.add(textField);
 
		label = new JLabel("Rien pour le moment");
 
		panel.add(label);
 
		JButton bouton = new JButton(new GetAction(this, "Changer le texte de place"));
 
		panel.add(bouton);
 
		return panel;
	}
 
	//...
}

On a donc passé this (référence à la classe courante) à notre GetAction et on a appliqué cette action sur notre bouton.

Pour finir, voilà ce que donne notre petite application :

Récupération du texte saisi
Récupération du texte saisi

La manipulation des textFields est donc très simple.

Code complet :

6.2. Application au projet

Maintenant que nous savons comment utiliser des JTextField, on va ajouter deux champs textes à notre calculatrice.

Voilà ce que ça va donner :

 
Sélectionnez
//...
import javax.swing.JTextField;
 
public class CalculatriceFenetre extends JFrame {
	private JTextField field1;
	private JTextField field2;
 
	//...
 
	private JPanel buildContentPane(){
		JPanel panel = new JPanel();
		panel.setLayout(new FlowLayout());
		panel.setBackground(Color.white);
 
		field1 = new JTextField();
		field1.setColumns(10);
 
		panel.add(field1);
 
		field2 = new JTextField();
		field2.setColumns(10);
 
		panel.add(field2);
 
		JButton bouton = new JButton(new CalculAction(this, "Calculer"));
 
		panel.add(bouton);
 
		JLabel label = new JLabel("Résultat : Pas encore calculé");
 
		panel.add(label);
 
		return panel;
	}
 
	public JTextField getField1(){
		return field1;
	}
 
	public JTextField getField2(){
		return field2;
	}
}

Ce qui devrait nous donner à l'affichage ceci :

Image non disponible
Notre calculatrice

Code complet :


précédentsommairesuivant

Vous avez aimé ce tutoriel ? Alors partagez-le en cliquant sur les boutons suivants : Viadeo Twitter Facebook Share on Google+   

  

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2009 Baptiste Wicht. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.