• Aucun résultat trouvé

D - Boîtes de sélection

Dans le document Télécharger cours Java en pdf (Page 184-196)

IV - Interfaces graphiques

IV- D - Boîtes de sélection

JOptionPane.showInputDialog(null,"Quel est votre nom","Saisie du nom",JOptionPane.QUESTION_MESSAGE )

+ "]"); }//main }//classe

L'affichage de la boîte de saisie :

L'affichage console : Chaîne saisie [dupont]

IV-D - Boîtes de sélection

Nous nous intéressons maintenant à un certain nombre de boîtes de sélection prédéfinies dans Java 2 :

JFileChooser boîte de sélection permettant de désigner un fichier dans l'arborescence des fichiers

boîte de sélection permettant de choisir une couleur

IV-D-1 - Boîte de sélection JFileChooser

Nous allons construire l'application suivante :

Les contrôles sont les suivants :

type nom rôle

0 JScrollPane jScrollPane1 Conteneur défilant

pour la boîte de texte 1

1 JTextArea lui-même

dans le JScrollPane

txtTexte texte tapé par

l'utilisateur ou chargé à partir d'un fichier

2 JButton btnSauvegarder permet de

sauvegarder le texte de 1 dans un fichier texte

3 JButton btnCharger permet de charger le

contenu d'un fichier texte dans 1

4 JButton btnEffacer efface le contenu de

1

Un contrôle non visuel est utilisé : jFileChooser1. Celui-ci est pris dans la palette des conteneurs swing de JBuilder :

Nous déposons le composant dans la fenêtre de conception mais en-dehors du formulaire. Il apparaît dans la liste des composants :

Nous donnons maintenant le code utile du programme pour en avoir une vue d'ensemble : import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.filechooser.FileFilter; import java.io.*;

public class dialogues extends JFrame { // les composants du cadre

JPanel contentPane;

JButton btnSauvegarder = new JButton(); JButton btnCharger = new JButton(); JButton btnEffacer = new JButton();

JScrollPane jScrollPane1 = new JScrollPane(); JTextArea txtTexte = new JTextArea();

JFileChooser jFileChooser1 = new JFileChooser();

// les filtres de fichiers

javax.swing.filechooser.FileFilter filtreTxt = null; //Construire le cadre public dialogues() { enableEvents(AWTEvent.WINDOW_EVENT_MASK); try { jbInit(); // autres initialisations moreInit(); } catch(Exception e) { e.printStackTrace(); } } // moreInit

private void moreInit(){

// initialisations à la construction de la fenêtre // filtre *.txt

filtreTxt = new javax.swing.filechooser.FileFilter(){ public boolean accept(File f){

// accepte-t-on f ?

return f.getName().toLowerCase().endsWith(".txt"); }//accept

public String getDescription(){ // description du filtre

return "Fichiers Texte (*.txt)"; }//getDescription

};

// on ajoute le filtre

jFileChooser1.addChoosableFileFilter(filtreTxt); // on veut aussi le filtre de tous les fichiers jFileChooser1.setAcceptAllFileFilterUsed(true);

// on fixe le répertoire de départ de la boîte FileChooser au répertoire courant jFileChooser1.setCurrentDirectory(new File("."));

}

//Initialiser le composant

private void jbInit() throws Exception { ...

}

//Remplacé, ainsi nous pouvons sortir quand la fenêtre est fermée protected void processWindowEvent(WindowEvent e) {

... }

}

void btnCharger_actionPerformed(ActionEvent e) {

// choix d'un fichier à l'aide d'un objet JFileChooser // on fixe le filtre initial

jFileChooser1.setFileFilter(filtreTxt); // on affiche la boîte de sélection

int returnVal = jFileChooser1.showOpenDialog(this); // l'utilisateur a-t-il choisi qq chose ?

if(returnVal == JFileChooser.APPROVE_OPTION) { // on met le fichier dans le champ texte lireFichier(jFileChooser1.getSelectedFile()); }//if

}//btnCharger_actionPerformed

// lireFichier

private void lireFichier(File fichier){

// affiche le contenu du fichier texte fichier dans le champ texte // on efface le champ texte

txtTexte.setText(""); // qqs données

BufferedReader IN=null; String ligne=null; try{

// ouverture fichier en lecture

IN=new BufferedReader(new FileReader(fichier)); // on lit le fichier ligne par ligne

while((ligne=IN.readLine())!=null){ txtTexte.append(ligne+"\n"); }//while

// fermeture fichier IN.close();

}catch(Exception ex){

// une erreur s'est produite txtTexte.setText(""+ex); }//catch } // effacer void btnEffacer_actionPerformed(ActionEvent e) { // on efface la boîte de texte

txtTexte.setText(""); }

// sauvegarder

void btnSauvegarder_actionPerformed(ActionEvent e) {

// sauvegarde le contenu de la boîte de texte dans un fichier // on fixe le filtre initial

jFileChooser1.setFileFilter(filtreTxt);

// on affiche la boîte de sélection de sauvegarde int returnVal = jFileChooser1.showSaveDialog(this); // l'utilisateur a-t-il choisi qq chose ?

if(returnVal == JFileChooser.APPROVE_OPTION) {

// on écrit le contenu de la boîte de texte dans fichier écrireFichier(jFileChooser1.getSelectedFile());

}//if }

// lireFichier

private void écrireFichier(File fichier){

// écrit le contenu de la boîte de texte dans fichier // qqs données

PrintWriter PRN=null; try{

// ouverture fichier en écriture

PRN=new PrintWriter(new FileWriter(fichier)); // on écrit le contenu de la boîte de texte PRN.print(txtTexte.getText());

// fermeture fichier PRN.close();

}catch(Exception ex){

// une erreur s'est produite txtTexte.setText(""+ex); }//catch

}

Nous ne commenterons pas le code des méthodes btnEffacer_Click, lireFichier et écrireFichier qui n'amènent rien qui n'a déjà été vu. Nous nous attarderons sur la classe JFileChooser et son utilisation. Cette classe est complexe, du genre "usine à gaz". Nous n'utilisons ici que les méthodes suivantes :

addChoosableFilter(FileFilter) fixe les types de fichiers proposés à la sélection

setAcceptAllFileFilterUsed(boolean) indique si le type 'Tous les fichiers" doit être proposé à la sélection ou non

File getSelectedFile() le fichier (File) choisi par l'utilisateur

int showSaveDialog() méthode qui affiche la boîte de sélection de sauvegarde. Rend un résultat de type int. La valeur jFileChooser.APPROVE_OPTION indique que l'utilisateur a fait un choix valide. Sinon, il a soit annulé le choix, soit une erreur s'est produite.

setCurrentDirectory pour fixer le répertoire initial à partir duquel l'utilisateur va commencer à explorer le système de fichiers

setFileFilter(FileFilter) pour fixer le filtre actif La méthode showSaveDialog affiche une boîte de sélection analogue à la suivante :

1 liste déroulante construite avec la méthode addChoosableFilter. Elle contient ce qu'on appelle des filtres de sélection représentés par la classe FileFilter. C'est au développeur de définir ces filtres et de les ajouter à la liste 1.

2 dossier courant, fixé par la méthode setCurrentDirectory si cette méthode a été utilisée, sinon le répertoire courant sera le dossier "Mes Documents" sous windows ou le home Directory sous Unix.

3 nom du fichier choisi ou tapé directement par l'utilisateur. Sera disponible avec la méthode getSelectedFile() 4 boutons Enregistrer/Annuler. Si le bouton Enregistrer est utilisé, la méthode showSaveDialog rend le

résultat jFileChooser.APPROVE_OPTION

Comment les filtres de fichiers de la liste déroulante 1 sont-ils construits ? Les filtres sont ajoutés à la liste 1 à l'aide de la méthode :

addChoosableFilter(FileFilter) fixe les types de fichiers proposés à la sélection

de la classe JFileChooser. Il nous reste à connaître la classe FileFilter. C'est en fait la classe

javax.swing.filechooser.FileFilter qui est une classe abstraite, c.a.d. une classe qui ne peut être instantiée mais

seulement dérivée. Elle est définie comme suit :

FileFilter() constructeur

boolean accept(File) indique si le fichier f appartient au filtre ou non

String getDescription() chaîne de description du filtre

Prenons un exemple. Nous voulons que la liste déroulante 1 offre un filtre pour sélectionner les fichiers *.txt avec la description "Fichiers texte (*.txt)".

il nous faut créer une classe dérivée de la classe FileFilter

utiliser la méthode boolean accept(File f) pour rendre la valeur true si le nom du fichier f se termine par .txt

utiliser la méthode String getDescription() pour rendre la description "Fichiers texte (*.txt)" Ce filtre pourrait être défini dans notre application de la façon suivante :

javax.swing.filechooser.FileFilter filtreTxt = new javax.swing.filechooser.FileFilter(){ public boolean accept(File f){

// accepte-t-on f ?

return f.getName().toLowerCase().endsWith(".txt"); }//accept

public String getDescription(){ // description du filtre

return "Fichiers Texte (*.txt)"; }//getDescription

};

Ce filtre serait ajouté à la liste des filtres de l'objet jFileChooser1 par l'instruction : // on ajoute le filtre *.txt

jFileChooser1.addChoosableFileFilter(filtretxt);

Tout ceci et quelques autres initialisations sont faites dans la méthode moreInit exécutée à la construction de la fenêtre (cf programme complet ci-dessus). Le code du bouton Sauvegarder est le suivant :

void btnSauvegarder_actionPerformed(ActionEvent e) {

// sauvegarde le contenu de la boîte de texte dans un fichier // on fixe le filtre initial

jFileChooser1.setFileFilter(filtreTxt);

// on affiche la boîte de sélection de sauvegarde int returnVal = jFileChooser1.showSaveDialog(this); // l'utilisateur a-t-il choisi qq chose ?

if(returnVal == JFileChooser.APPROVE_OPTION) {

// on écrit le contenu de la boîte de texte dans fichier écrireFichier(jFileChooser1.getSelectedFile());

}//if }

La séquence des opérations est la suivante :

• on fixe le filtre actif au filtre *.txt afin de permettre à l'utilisateur de chercher de préférence ce type de fichiers. Le filtre "Tous les fichiers" est également présent. Il a été ajouté dans la procédure moreInit. On a donc deux filtres.

• la boîte de sélection de sauvegarde est affichée. Ici on perd la main, l'utilisateur utilisant la boîte de sélection pour désigner un fichier du système de fichiers.

• lorsqu'il quitte la boîte de sélection, on teste la valeur de retour pour voir si on doit ou non sauvegarder la boîte de texte. Si oui, elle doit l'être dans le fichier obtenu par la méthode getSelectedFile.

Le code lié au bouton "Charger" est très analogue au code du bouton "Sauvegarder".

void btnCharger_actionPerformed(ActionEvent e) {

// choix d'un fichier à l'aide d'un objet JFileChooser // on fixe le filtre initial

jFileChooser1.setFileFilter(filtreTxt); // on affiche la boîte de sélection

int returnVal = jFileChooser1.showOpenDialog(this); // l'utilisateur a-t-il choisi qq chose ?

if(returnVal == JFileChooser.APPROVE_OPTION) { // on met le fichier dans le champ texte lireFichier(jFileChooser1.getSelectedFile()); }//if

}//btnCharger_actionPerformed

Il y a deux différences :

pour afficher la boîte de sélection de fichiers, on utilise la méthode showOpenDialog au lieu de la méthode showSaveDialog. La boîte de sélection affichée est analogue à celle affichée par la méthode

showSaveDialog.

si l'utilisateur a bien sélectionné un fichier, on appelle la méthode lireFichier plutôt que la méthode

écrireFichier.

IV-D-2 - Boîtes de sélection JColorChooser et JFontChooser

Nous continuons l'exemple précédent en ajoutant deux nouveaux boutons :

type nom rôle

6 JButton btnCouleur pour fixer la couleur

des caractères du TextBox

7 JButton btnPolice pour fixer la police

de caractères du TextBox

Le composant JColorChooser permettant d'afficher une boîte de sélection de couleur peut être trouvée dans la liste des composants swing de JBuilder :

Nous déposons ce composant dans la fenêtre de conception, mais en-dehors du formulaire. Il est non visible dans le formulaire mais néanmoins présent dans la liste des composants de la fenêtre :

La classe JColorChooser est très simple. On affiche la boîte de sélection des couleurs avec la méthode int showDialog :

static Color showDialog(Component component, String

title, Color initialColor)

Component component le composant parent de la boîte de sélection, généralement une fenêtre JFrame

String title le titre dans la barre de titre de la boîte de sélection

Color intialColor couleur initialement sélectionnée dans la boîte de sélection

Si l'utilisateur choisit une couleur, la méthode rend une couleur sinon la valeur null. Le code lié au bouton Couleur est le suivant :

void btnCouleur_actionPerformed(ActionEvent e) {

// choix d'une couleur de texte à l'aide du composant JColorChooser Color couleur;

if((couleur=jColorChooser1.showDialog(this,"Choix d'une couleur",Color.BLACK))!=null){ // on fixe la couleur des caractères de la boîte de texte

txtTexte.setForeground(couleur); }//if

}

La classe Color est définie dans java.awt.Color. Diverses constantes y sont définies dont Color.BLACK pour la couleur noire. La boîte de sélection affichée est la suivante

Assez curieusement, la bibliothèque swing n'offre pas de classe pour sélectionner une police de caractères. Heureusement, il y a les ressources Java d'internet. En effectuant une recherche sur le mot clé "JFontChooser" qui semble un nom possible pour une telle classe on en trouve plusieurs. L'exemple qui va suivre va nous donner l'occasion de configurer JBuilder pour qu'il utilise des paquetages non prévus dans sa configuration initiale.

Le paquetage récupéré s'appelle swingextras.jar et a été placé dans le dossier <jdk>\jre\lib\perso où <jdk> désigne le répertoire d'installation du jdk utilisé par JBuilder. Il aurait pu être placé n'importe où ailleurs.

Regardons le contenu du paquetage SwingExtras.jar :

On y trouve le code source java des composants proposés dans le paquetage. On y trouve également les classes elles-mêmes :

De cette archive, on retiendra que la classe JFontChooser s'appelle en réalité

com.lamatek.swingextras.JFontChooser. Si on ne souhaite pas écrire le nom complet, il nous faudra écrire en début

de programme :

import com.lamatek.swingextras.*;

Comment feront le compilateur et la machine virtuelle Java pour trouver ce nouveau paquetage ? Dans le cas d'une utilisation directe du JDK cela a déjà été expliqué et le lecteur pourra retrouver les explications dans le paragraphe sur les paquetages Java. Nous détaillons ici la méthode à utiliser avec JBuilder. Les paquetages sont configurés dans le menu Options/Configurer les JDK :

1 Le bouton Modifier (1) permet d'indiquer à JBuilder quel JDK utilisé. Dans cet exemple, JBuilder avait amené avec lui le JDK 1.3.1. Lorsque le JDK 1.4 est sorti, il a été installé séparément de JBuilder et on a utilisé le bouton Modifier pour indiquer à JBuilder d'utiliser désormais le JDK 1.4 en désignant le répertoire d'installation de ce dernier

2 répertoire de base du JDK actuellement utilisé par JBuilder

3 liste des archives java (.jar) utilisées par JBuilder. On peut en ajouter d'autres avec le bouton Ajouter (4) 4 Le bouton Ajouter (4) permet d'ajouter de nouveaux paquetages que JBuilder utilisera à la fois pour la

compilation et l'exécution des programmes. On l'a utilisé ici pour ajouter le paquetage SwingExtras.jar (5) Maintenant JBuilder est correctement configuré pour pouvoir utiliser la classe JFontChooser. Cependant, il nous faudrait avoir accès à la définition de cette classe pour l'utiliser correctement. L'archive swingextras.jar contient des fichiers html qu'on pourrait extraire pour les exploiter. C'est inutile. La documentation java incluse dans les fichiers .jar est directement accessible de JBuilder. Il faut pour cela configurer l'onglet Documentation (6) ci-dessus. On obtient la nouvelle fenêtre suivante :

Le bouton Ajouter nous permet d'indiquer que le fichier SwingExtras.jar doit être exploré pour la documentation. Cette démarche validée, on peut constater qu'on a effectivement accès à la documentation de SwingExtras.jar. Cela se traduit par diverses facilités :

• si on commence à écrire l'instruction d'importation

import com.lamatek.swingextras.*;

on pourra constater que JBuilder nous fournit une aide :

Le paquetage com.lamatek est bien trouvé.

• si maintenant sur le programme suivant :

import com.lamatek.swingextras.*;

public class test{

JFontChooser jFontChooser1=null; }

On voit dans la barre d'état 1 que c'est bien un fichier html du paquetage swingextras.jar qui est utilisé. L'exemple présenté ci-dessus est suffisament explicite pour qu'on puisse écrire le code du bouton Police de notre application :

void btnPolice_actionPerformed(ActionEvent e) {

// choix d'une police de texte à l'aide du composant JFontChooser jFontChooser1 = new JFontChooser(new Font("Arial", Font.BOLD, 12));

if (jFontChooser1.showDialog(this, "Choix d'une police") == JFontChooser.ACCEPT_OPTION) { // on change la police des caractères de la boîte de texte

txtTexte.setFont(jFontChooser1.getSelectedFont()); }//if

}

La boîte de sélection affichée par la méthode showDialog ci-dessus est la suivante :

Dans le document Télécharger cours Java en pdf (Page 184-196)