IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)



Comment faire un JLabel de plusieurs lignes ?
auteur : Clément Cunin
Le HTML :
La plus simple des méthodes pour avoir un texte sur plusieurs lignes est d'utiliser l'interpréteur HTML du JLabel. Pour cela il faut que le texte soit entouré des balises '<html>' et '</html>'. Ensuite il faut remplacer les "\n" par des balises '<br>', et le tour est joué !

new JLabel("<html>ligne 1<br>ligne 2<br>etc...</html>");
Le composant texte :
Il est également possible d'utiliser un <javaClass class="javax.swing.JTextArea" /> plus pratique à mettre en place que la version Html si le texte n'est pas fixé dans le code... Cette solution est néanmoins plus contraignante sur la mise en page et sur la gestion de l'apparence (par défaut le <javaClass class="javax.swing.JTextArea" /> n'a pas les mêmes couleurs qu'un JLabel).
(Un exemple est disponible en téléchargement)

JTextArea label = new JTextArea();label.setText(text);label.setEnabled(false);
La solution de la brute :
Empiler 2 ou 3 JLabel les uns au dessus des autres devrait faire l'affaire :-).

téléchargement : Exemple de texte multi-ligne en utilisant un JTextArea.

Comment faire un minuteur (timer) facilement ?
auteur : Johann Heymes
On peut utiliser la classe <javaClass class="java.lang.Thread" /> ou implémenter l'interface <javaInterface name_interface="java.lang.Runnable" />, mais suivant les cas de figure cela représente beaucoup de code et de contraintes. En effet, les instructions qui affectent ou dépendent d'un composant graphique Swing doivent être effectuées par le processus d'évènement (the event-dispatching thread). Par conséquent si l'on utilise la classe Thread ou l'interface Runnable il est nécessaire d'utiliser les méthodes : <javaMethode class="javax.swing.SwingUtilities" methode="invokeLater(java.lang.Runnable)" /> ou <javaMethode class="javax.swing.SwingUtilities" methode="invokeAndWait(java.lang.Runnable)" /> de la classe <javaClass class="javax.swing.SwingUtilities" />.

La classe Timer :
La classe <javaClass class="javax.swing.Timer" /> remplace avantageusement l'utilisation directe de thread. Elle génère un évènement à intervalles réguliers (à la milli-seconde). C'est le "event-dispatching thread" qui exécute l'évènement, donc on peut directement modifier des objets graphiques.

Méthodes importantes :
le constructeur de <javaClass class="javax.swing.Timer" /> :

public Timer (int delay, ActionListener listener); <comment>delay = l'intervale de temps entre chaque évènement.listener = l'objetécouteur de ces evènements.</comment>
méthode permettant de lancer le processus :

public void start();
méthode permettant de stopper le processus :

public void stop();
Note :
Cette méthode est à utiliser uniquement si le traitement à faire est court en temps d'exécution sinon on aura une interface non réactive pendant le traitement ....

lien :
lien :
téléchargement : Exemple d'utilisation pour faire un compteur.

Comment traduire le JFileChooser ou le JColorChooser en français ?
Ces boîtes de dialogue ne suivent pas la locale de votre système. En fait chaque texte affiché dans ces boîtes de dialogue correspond à une ressource du UIManager. Il va donc falloir changer ces ressources.

Par exemple pour le JFileChooser vous pouvez dans votre code faire :

UIManager.put("FileChooser.saveButtonText","Enregistrer");UIManager.put("FileChooser.openButtonText","Ouvrir");UIManager.put("FileChooser.cancelButtonText","Annuler");UIManager.put("FileChooser.updateButtonText","Actualiser");UIManager.put("FileChooser.helpButtonText","Aide");UIManager.put("FileChooser.saveButtonToolTipText","Enregistre le fichier");

Comment utiliser un filtre de fichiers dans un JFileChooser ?
auteur : Clément Cunin
Le <javaClass class="javax.swing.JFileChooser"/> est un outil très pratique pour inviter l'utilisateur à choisir le nom d'un fichier. Mais dans le cadre d'une application, on a souvent besoin de limiter cette selection à un groupe de fichiers (souvent identifiés par leur extension). Cette fonctionnalité est supportée par le JFileChoser via l'interface <javaInterface class="javax.swing.filechooser.FileFilter"/>, aucune implantation concrète étant disponible, c'est à nous de coder.

Notre filtre :

<comment_javadoc>Cette classe permet d'ajouter un filtre basé sur l'extention des fichiers.</comment_javadoc>public class FiltreExtension implements javaw.swing.filechooser.FileFilter<comment>Le texte qui sera affiché dans le comboBox du JFileChooser.</comment>private String description;<comment>Extention de notre fichier (inclus le '.')</comment>private String extention;<comment_javadoc>Constructeur.@param description, le texte de description pour l'utilisateur.@param extention, l'extention du fichier (commencant par '.')</comment_javadoc>public FiltreExtension( String description, String extension ) this.desription = description;this.extension = extension;<comment_javadoc>Indique si le fichier est accepté par le filtre.@return vrai si le fichier est accepté.</comment_javadoc>public boolean accept(File file)<comment>On accepte tous les répertoires.</comment>if( file.isDirectory() ) return( true );<comment>On test l'extension du fichier</comment>String nomFichier = file.getPath().toLowerCase();return( nomFichier.endsWith(this.extension) );public String getDescription()return(this.description+"(*"+this.extension+")");
Utilisation :

<comment>Création du JFileChooser :</comment><br/>JFileChooser jfc = new JFileChooser();<br/>jfc.setCurrentDirectory(new File("."));<br/><br/><comment>Ajout de filtre :</comment><br/>jfc.addChoosableFileFilter(new FiltreExtension("Fichier XML",".xml"));<br/>jfc.addChoosableFileFilter(new FiltreExtension("Fichier XSL",".xsl"));<br/>jfc.addChoosableFileFilter(new FiltreExtension("Fichier JAVA", ".java"));<br/><br/><comment>Affichage et traitement du résultat :</comment><br/>int resultat = jfc.showOpenDialog(this);<br/>if (resultat == JFileChooser.APPROVE_OPTION) File fichier = jfc.getSelectedFile();<br/><comment> suite du code...</comment>

Mon menu contextuel s'affiche hors de l'écran, que faire ?
auteur : Clément Cunin
JDK 1.3 et inférieur :
Lorsque l'on utilise la méthode <javaMethode class="javax.swing.JPopupMenu" methode="show(java.awt.Component, int, int)"/> pour afficher un <javaClass class="javax.swing.JPopupMenu"/>, les coordonnées correspondent au coin haut-gauche du menu. Si ces coordonnées sont trop près du bord de l'écran, une partie du menu est alors cachée. Nous allons donc surcharger la méthode show() pour que les coordonnées soient corrigées si le message est trop proche du bord de l'écran.

class MonPopupMenu extends JPopupMenu public void show(Component invoker, int x, int y)<comment>Dimension de l'écran</comment>Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();<comment>Dimension du Menu popup</comment>Dimension popupSize = this.getPreferredSize();<comment>Position en x,y du popup à l'écran (pour le .show)</comment>double xPopupEcran = invoker.getLocationOnScreen().getX() + x;double yPopupEcran = invoker.getLocationOnScreen().getY() + y;<comment>Si le popup déborde de l'écran sur la droite on décale sur x</comment>if ((xPopupEcran + popupSize.getWidth()) > screenSize.getWidth())x = x - (int)popupSize.getWidth();<comment>Si le popup déborde de l'écran sur le bas on décale sur y</comment>if ((yPopupEcran + popupSize.getHeight()) > screenSize.getHeight())y = y - (int)popupSize.getHeight();<comment>On affiche le popup à l'endroit judicieusement calculé :)</comment>super.show(invoker, x, y);
JDK 1.4 :
Ce bug a été résolu dans la version 1.4 de l'API. Le correctif n'est pas nécessaire.


Comment faire un JTextArea avec un retour à la ligne automatique ?
auteur : Clément Cunin
Tout simplement en utilisant les méthodes <javaMethode class="javax.swing.JTextArea" methode="setLineWrap(boolean)"/> et <javaMethode class="javax.swing.JTextArea" methode="setWrapStyleWord(boolean)"/> de la classe <javaClass class="javax.swing.JTextArea"/>.

<comment>On souhaite un retour à ligne automatique :</comment>monTextArea.setLineWrap(true);<comment>On souhaite que les mots ne soient pas coupés :</comment>monTextArea.setWrapStyleWord(true);

Comment contraindre la saisie dans un composant texte ?
auteur : Johann Heymes
Exemple :
Comment autoriser l'utilisateur à ne saisir que des entiers dans un champ texte. Trois solutions s'offrent à vous :
  • écouter les évènements ;
  • modifier le modèle du composant texte ;
  • utiliser la classe <javaClass class="javax.swing.JFormattedTextField">JFormattedTextField</javaClass> (dispo seulement depuis le JDK 1.4).

Solution 1, les écouteurs (listener) :
Il s'agit sûrement des premières solutions auxquelles on pense mais ce ne sont pas les plus simples à mettre en place ni les plus jolies. Je parle ici évidemment de <javaClass class="java.awt.event.KeyListener">KeyListener</javaClass> ou <javaClass class="javax.swing.event.DocumentListener">DocumentListener</javaClass> et autres du même genre. Pour moi, ces solutions sont des solutions de rattrapage car techniquement elles permettent uniquement de nous informer d'un changement. Or si le changement est fait cela veux donc dire que le « mal » est déjà fait. Ce qui signifie que le composant texte à un moment donné est dans une situation non cohérente. Je m'arrêterai donc là sur ce sujet.

Solution 2, modification du modèle :
La notion de modèle provient du design pattern  MVC, Model-View-Controller Architecture, le but ici est donc de modifier directement ce que peut contenir un composant texte en ignorant tout le reste. Pour se faire il suffit de créer une classe qui dérive du modèle auquel le composant texte est associé. Pour information nous avons :
  • JTextField et JTextArea : PlainDocument ;
  • JEditorPane et JTextPane : DefaultStyledDocument.
Ces deux classes implémentent toutes deux l'interface <javaClass class="javax.swing.text.Document"/> qui définit entre autres la méthode <javaMethode class="javax.swing.text.Document" methode="insertString(int, java.lang.String, javax.swing.text.AttributeSet)">insertString</javaMethode> et <javaMethode class="javax.swing.text.Document" methode="remove(int, int)">remove</javaMethode>. Il suffit donc de créer une classe qui dérive de la classe modèle apropriée et de rédéfinir la ou les méthodes nécessaires. Notons que ces deux méthodes insertString et remove seront appelées automatiquement par les classes de Sun à chaque ajout ou suppression de chaîne. Notre redéfinition doit donc avoir pour but de valider ou non l'action. Par conséquent on notera que l'intégrité du composant texte n'est jamais bafouée (voir démo ci-dessous.)

Solution 3, la classe :JFormattedTextField
Une toute nouvelle classe fait son apparition dans la version 1.4 du JDK : <javaClass class="javax.swing.JFormattedTextField"/>. L'exemple ici est très réducteur de ces capacités mais la prise en main est peut-être moins évidente. En tout cas le résultat et là et il est même largement meilleur... regardez l'exemple :-)

lien :  Model-View-Controller Architecture
téléchargement : Exemple d'implémentation de la solution 2
téléchargement : Exemple d'implémentation de la solution 3

Comment avoir un éditeur de texte avec plusieurs styles de mise en page ?
auteur : Johann Heymes
Quel composant choisir ?
Vous avez le choix entre JTextPane et JEditorPane. En effet, ce sont les seuls à utiliser comme "Model" (Cf Model-View-Controller Architecture) un composant dérivant de AbstractDocument et implémentant l'interface StyledDocument.

Mise en page à la création :
Si la mise en page est fixée lors de la création du document, il suffit de récupérer le Model du composant texte.

JTextPane monComposantTexte = new JTextPane ();DefaultStyledDocument doc = (DefaultStyledDocument) monComposantTexte.getDocument ();
Et d'utiliser la méthode :

doc.insertString (offset, "texte à ajouter", <comment>[un style d'écriture]</comment>);
Style déterminé a l'insertion :
Si le style est connu lors de l'insertion, il faut créer une classe qui hérite de DefaultStyledDecument et redéfinir la méthode insertString(). Exemple pour écrire tout le texte avec le style nomme styleNormal sauf si l'on insert le mot 'HELP' :

<comment>Redéfini pour choisir l'effet de style à utiliser</comment>public void insertString(int offs, String str, AttributeSet a) throws BadLocationExceptiontry <comment>si le texte inséré est égal à HELP le texte s'écritavec le style "styleOp"</comment>if ( str.equals ("HELP") )super.insertString (offs, str, getStyle ("styleOp"));else <comment>Sinon le texte est écrit avec le style "styleNormal"</comment>super.insertString (offs, str, getStyle ("styleNormal")); catch (BadLocationException e)System.out.println ("Tuuuttt erreur Insere");
(Voir l'exemple fourni.)

Modifier le Style après l'insertion :
Pour cela il faut soit récupérer le Model du composant Texte, soit créer sa propre classe dérivant de DefaultStyledDocument.

JTextPane monComposantTexte = new JTextPane ();DefaultStyledDocument doc = (DefaultStyledDocument) monComposantTexte.getDocument ();doc.setCharacterAttributes (positionDeDepart, longueur, style, true);
Voir l'exemple fourni.)

téléchargement : Editeur de texte simple, avec changement d'attribut d'une portion de texte

Comment faire pour que le dernier ajout de texte dans un JTextArea contenu dans un JScrollPane soit visible ?
auteur : Johann Heymes
On demande au JTextPane de transmettre à son parent les coordonnées d'un point qui doit être visible.

trymonTextArea.scrollRectToVisible(monTextArea.modelToView(monTextArea.getDocument().getLength ()));catch (javax.swing.text.BadLocationException err)
téléchargement : MonJTextArea.java

Comment rendre certaines cellules non éditables (JTable) ?
auteur : Johann Heymes
Pour que certaines cellules d'une JTable ne soient pas éditables, il faut créer sa propre classe dérivant de <javaClass class="javax.swing.table.DefaultTableModel"/> et redéfinir la méthode <javaMethode methode="isCellEditable(int,int)" class="javax.swing.table.DefaultTableModel" /> afin que cette dernière retourne faux pour ces cellules.

public boolean isCellEditable (int row, int column)if ( celluleEstEditable )return ( true );elsereturn ( false );
téléchargement : CustomTableModel1.java

Comment faire des colonnes fixes dans une JTable ?
auteur : Johann Heymes
On préférera un petit exemple à un long discours ;-)

téléchargement : JTableFixedColumn.java

Pourquoi les en-têtes de ma JTable ne s'affichent-ils pas ?
auteur : Johann Heymes
Les <javaClass class="javax.swing.JTable" /> sont prévus pour être affichés dans un JScrollPane, si ce n'est pas le cas l'en-tête n'est pas affiché. Pour l'afficher, vous pouvez récupérer l'en-tête en utilisant <javaMethode class="javax.swing.JTable" methode="getTableHeader()" /> et l'afficher séparement.

Un exemple est disponible ci-dessous.

lien :
téléchargement : Exemple d'implémentation.

Quelle cellule de ma JTable a été cliquée ?
auteur : Johann Heymes
Il suffit d'utiliser les méthodes <javaMethode class="javax.swing.JTable" methode="columnAtPoint(java.awt.Point)" /> et <javaMethode class="javax.swing.JTable" methode="rowAtPoint(java.awt.Point)" /> en lui passant le paramètre récupéré sur l'évènement <javaClass class="java.awt.event.MouseEvent">MouseEvent</javaClass>

int colonne, ligne;Point p = e.getPoint ();colonne = jtable.columnAtPoint (p);ligne = jtable.rowAtPoint (p);
téléchargement : Exemple d'implémentation.

Comment ancrer les colonnes d'une JTable ?
auteur : Clément Cunin
Il est parfois peu souhaitable que l'utilisateur puisse permuter les colonnes d'une <javaClass class="javax.swing.JTable"/>. Contre tout attente, la méthode permettant d'intervenir sur cette propriété n'est pas dans la classe JTable, mais dans la classe <javaClass class="javax.swing.table.JTableHeader" />. Le code suivant permet d'annuler cette fonctionnalité.

maJTable.getTableHeader().setReorderingAllowed(false);


Ce document issu de http://www.developpez.com est soumis à la licence GNU FDL traduit en français ici.
Permission vous est donnée de distribuer, modifier des copies de cette page tant que cette note apparaît clairement.