
FAQ JavaFXConsultez toutes les FAQ
Nombre d'auteurs : 4, nombre de questions : 507, derni�re mise � jour : 2 novembre 2016 Ajouter une question
Cette FAQ a �t� r�alis�e � partir des questions fr�quemment pos�es sur le forum JavaFX de http://java.developpez.com ainsi que l'exp�rience personnelle des auteurs.
Nous tenons � souligner que cette FAQ ne garantit en aucun cas que les informations qu'elle propose sont correctes. Les auteurs font leur maximum, mais l'erreur est humaine. Cette FAQ ne pr�tend pas non plus �tre compl�te. Si vous trouvez une erreur, ou que vous souhaitez nous aider en devenant r�dacteur, lisez ceci.
Sur ce, nous vous souhaitons une bonne lecture.
- Comment cr�er un champ d��dition textuel ?
- Comment cr�er un champ d��dition de mot de passe ?
- Comment cr�er une zone d��dition textuelle ?
- Comment savoir quand le contenu de mon champ d'�dition a �t� modifi� ?
- Comment modifier le texte dans un champ d'�dition ?
- Comment savoir quand la s�lection dans mon champ d'�dition a �t� modifi�e ?
- Comment modifier la s�lection dans un champ d'�dition ?
- Comment copier la s�lection d'un champ d'�dition ?
- Comment couper la s�lection d'un champ d'�dition ?
- Comment coller le contenu du presse-papier dans un champ d'�dition ?
- Comment savoir quand la position du curseur de saisie dans mon champ d'�dition a �t� modifi�e ?
- Comment d�placer le curseur de saisie dans un champ d��dition ?
- Comment d�sactiver la saisie sur un contr�le de saisie ?
- Comment afficher une invite sur un contr�le de saisie ?
- Comment valider un mot de passe ?
- Comment forcer le retour � la ligne dans TextArea ?
- Comment activer le clavier virtuel sur ordinateur de bureau ?
- Comment sp�cifier le type de clavier virtuel ?
- Comment restreindre l'�dition sur un contr�le de saisie ?
- Comment placer un filtre sur un formateur ?
- Comment placer un convertisseur sur un formateur ?
- Comment cr�er un bouton fl�ch� ?
- Comment peupler un bouton fl�ch� ?
- Comment r�cup�rer la valeur d'un bouton fl�ch� ?
- Comment modifier la valeur d'un bouton fl�ch� ?
- Comment restreindre l'�dition sur un bouton fl�ch� ?
Pour cr�er un champ d��dition textuel sur une seule ligne, vous devez cr�er une instance de la classe javafx.scene.control.TextField.
Par exemple :
Code Java : | S�lectionner tout |
final TextField textField = new TextField();
La propri�t� text de la classe TextField permet de positionner le texte sur le champ ou de savoir quand la valeur a �t� �dit�e.
Pour cr�er un champ d��dition de mot de passe sur une seule ligne, vous devez cr�er une instance de la classe javafx.scene.control.PasswordField. Les chaines de texte saisies dans cet �diteur seront masqu�es par un caract�re unique.
Par exemple :
Code Java : | S�lectionner tout |
final PasswordField textField = new PasswordField();
La propri�t� text de la classe PasswordField permet de positionner le texte sur le champ ou de savoir quand la valeur a �t� �dit�e.
Les m�thodes copy() et cut() ont �t� surcharg�es et n'ont aucun effet sur ce contr�le de saisie,
Pour cr�er une zone d��dition sur de multiples lignes, vous devez cr�er une instance de la classe javafx.scene.control.TextArea.
Par exemple :
Code Java : | S�lectionner tout |
final TextArea textArea = new TextArea();
La propri�t� text de la classe TextArea permet de positionner le texte sur le champ ou de savoir quand la valeur a �t� �dit�e.
Pour savoir si le contenu d'un champ d��dition a �t� modifi�, il suffit de placer un �couteur de type InvalidationListener ou ChangeListener sur sa propri�t� text.
Par exemple :
Code Java : | S�lectionner tout |
textField.textProperty().addListener(observable -> System.out.println("Champ d'�dition modifi� !"));
Il est possible de modifier le texte dans un champ d��dition via plusieurs m�thodes d��dition pr�tes � l'emploi :
- clear() - supprime tout le texte ;
- deleteNextChar() - cette m�thode supprime le caract�re situ� apr�s le curseur de saisie ;
- deletePreviousChart() - cette m�thode supprime le caract�re situ� avant le curseur de saisie ;
- deleteText() - cette m�thode supprime le texte contenu entre les indices ou l'IndexRange pass�s en param�tre ;
- insertText() - cette m�thode permet d�ins�rer du texte contenu � l'indice pass� en param�tre ;
- replaceSelection() - cette m�thode remplace la s�lection actuelle par un nouveau contenu ;
- replaceText() - cette m�thode permet de remplacer le texte contenu entre les indices ou l'IndexRange pass�s en param�tre.
Il est �galement bien s�r possible de modifier directement la valeur de la propri�t� text. Cependant, il est recommand� de passer par les m�thodes indiqu�es ici de mani�re � supporter les �volutions ou modifications futures de l'API ou les ports de JavaFX vers d'autres plateformes (ex.�: le remplacement du texte sur des plateformes mobiles ou tactiles ou plus modernes pourrait s'accompagner d'animations).
Pour savoir si la s�lection dans un champ d��dition a �t� modifi�e, il suffit de placer un �couteur de type InvalidationListener ou ChangeListener sur sa propri�t� en lecture seule selection.
Par exemple :
Code Java : | S�lectionner tout |
textField.selectionProperty().addListener(observable -> System.out.println("S�lection modifi�e dans le champ d'�dition !"));
La propri�t� selection contient une valeur de type javafx.scene.control.IndexRange qui permet de connaitre les indices de d�but et de fin de s�lection et de connaitre sa longueur. Cette valeur ne contient jamais la valeur null et est, par d�faut, initialis�e � la s�lection (0, 0). Un nouvel objet de type IndexRange est cr�� � chaque changement de s�lection.
Il existe plusieurs m�thodes pr�tes � l'emploi pour modifier la s�lection dans un champ d��dition :
- deselect() - supprime toute s�lection ;
- selectAll() - s�lectionne tout le texte ;
- selectBackward() - s�lectionne un caract�re en arri�re en d�pla�ant le curseur de saisie (suivant la position du curseur de saisie par rapport � la s�lection actuelle, peut d�s�lectionner un caract�re) ;
- selectEnd() - s�lectionne depuis la position actuelle jusqu�� la fin du texte tout en d�pla�ant le curseur de saisie ;
- selectEndOfNextWord() - s�lectionne depuis la position actuelle jusqu�� la fin du prochain mot tout en d�pla�ant le curseur de saisie ;
- selectForward() - s�lectionne un caract�re en avant en d�pla�ant le curseur de saisie (suivant la position du curseur de saisie par rapport � la s�lection actuelle, peut d�s�lectionner un caract�re) ;
- selectHome() - s�lectionne depuis la position actuelle jusqu�au d�but du texte sans en d�placer le curseur de saisie ;
- selectNextWord() - s�lectionne depuis la position actuelle jusqu�au d�but du prochain mot tout en d�pla�ant le curseur de saisie ;
- selectPositionCaret() - s�lectionne depuis le point actuel et positionne le curseur de saisie � l'endroit indiqu� ;
- selectPreviousWord() - s�lectionne depuis la position actuelle jusqu�au d�but du mot pr�c�dent tout sans d�placer le curseur de saisie ;
- selectRange() - s�lectionne l'intervalle sp�cifi� et d�place le curseur de saisie � la fin de cet intervalle.
Pour copier la s�lection actuelle d'un champ d��dition dans le presse-papier, il suffit d'appeler la m�thode copy() du champ d��dition.
Par exemple :
Code Java : | S�lectionner tout |
textField.copy();
si la s�lection est vide, la valeur du presse-papier ne sera pas modifi�e.
Pour couper la s�lection actuelle d'un champ d��dition (c'est-�-dire copier sa valeur dans le presse-papier, puis effacer la s�lection), il suffit d'appeler la m�thode cut() du champ d��dition.
Par exemple :
Code Java : | S�lectionner tout |
textField.cut();
si la s�lection est vide, la valeur du presse-papier ne sera pas modifi�e.
Pour coller le contenu du presse-papier dans un champ d��dition, il suffit d'appeler la m�thode paste() du champ d��dition. Ceci remplacera la s�lection actuelle s'il y en a une, sinon le nouveau contenu sera ins�r� � l'emplacement du curseur de saisie.
Par exemple :
Code Java : | S�lectionner tout |
textField.paste();
Pour savoir si la position du curseur de saisie d'un champ d'�dition a �t� modifi�e, il suffit de placer un �couteur de type InvalidationListener ou ChangeListener sur sa propri�t� en lecture seule caretPosition.
Par exemple :
Code Java : | S�lectionner tout |
textField.caretPositionProperty().addListener(observable -> System.out.println("Position du curseur d��dition modifi�e dans le champ d'�dition !"));
Outre les diverses m�thodes qui permettent de changer la s�lection dans un champ d��dition, il est possible de sp�cifier la position du curseur de saisie en appelant la m�thode positionCaret() et en lui passant un nouvel indice en param�tre.
Par exemple :
Code Java : | S�lectionner tout |
textField.positionCaret(10);
Invoquer cette m�thode supprimera la s�lection actuelle.
Pour d�sactiver la saisie sur un contr�le de saisie, vous devez mettre sa propri�t� editable � la valeur false.
Par exemple :
Code Java : | S�lectionner tout |
textField.setEditable(false);
Cela d�sactivera toute saisie au clavier, au clavier virtuel ou via le menu contextuel du contr�le.
Pour afficher un texte par d�faut ou une invite sur un contr�le de saisie, vous devez sp�cifier une valeur sur sa propri�t� promptText.
Par exemple :
Code Java : | S�lectionner tout |
loginField.setPromptText("Nom d'utilisateur");
Ce texte s'affichera uniquement quand le contr�le de saisie ne contient aucun texte.
Pour proc�der � une validation lorsque l'utilisateur appuie sur la touche � Entr�e � apr�s avoir saisi son mot de passe, vous devez fournir un callback de type EventHandler<ActionEvent> dans la propri�t� onAction du champ de saisie de mots de passe.
Par exemple :
Code Java : | S�lectionner tout |
1 2 3 4 5 6 7 8 9 10 | final PasswordField passwordField = new PasswordField(); passwordField.setPromptText("Mot de passe"); passwordField.setOnAction(new EventHandler<ActionEvent>() { @Override public void handle(ActionEvent e) { // Validation du mot de passe. // R�action en cas de mot de passe valide. // R�action en cas de mot de passe non valide. passwordField.clear(); } }); |
Ou :
Code Java : | S�lectionner tout |
1 2 3 4 5 6 7 8 | final PasswordField passwordField = new PasswordField(); passwordField.setPromptText("Mot de passe"); passwordField.setOnAction(actionEvent -> { // Validation du mot de passe. // R�action en cas de mot de passe valide. // R�action en cas de mot de passe non valide. passwordField.clear(); }); |
Note : c'est une bonne pratique que de vider le contenu du contr�le de saisie une fois la validation termin�e.
Pour forcer le retour � la ligne dans une instance de TextArea, vous devez modifier la valeur de sa propri�t� wrapText et la mettre � la valeur true.
Par exemple :
Code Java : | S�lectionner tout |
textArea.setWrapText(true);
JavaFX met � disposition un clavier virtuel pour les champs de saisie lorsqu'une application s�ex�cute sur une plateforme embarqu�e.
Il est possible d'activer le clavier virtuel sur un ordinateur de bureau en utilisant le param�tre suivant de la JVM :
Code : | S�lectionner tout |
-Dcom.sun.javafx.virtualKeyboard=javafx
Un clavier tactile s'affichera � l��cran d�s qu'un contr�le de saisie gagnera le focus.
Pour le moment, il semble que JavaFX ne supporte que les claviers virtuels QWERTY.
Il est possible de sp�cifier le type de clavier virtuel � utiliser sur un contr�le de saisie en modifiant la valeur attach�e � la cl� "vkType" dans les propri�t�s du contr�le de saisie. � l'heure actuelle, les valeurs suivantes sont admises :
- "numeric" - un clavier num�rique ne contenant que des chiffres ;
- "url" - un clavier destin� � saisir des URL web ;
- "email" - un clavier destin� � saisir des adresses m�l ;
- "text" - le clavier par d�faut.
Par exemple :
Code Java : | S�lectionner tout |
1 2 3 | final TextField emailField = new TextFiel(); emailField.setPromptText("Adresse m�l"); emailField.getProperties().put("vkType", "email"); |
Ici, un clavier param�tr� pour saisir des adresses m�l sera affich� � l��cran lorsque le champ de saisie emailField aura le focus.
� partir du JDK8_40, vous pouvez restreindre l��dition sur un contr�le de saisie en sp�cifiant une valeur de type javafx.scene.control.TextFormatter<V> dans sa propri�t� textFormatter.
Par exemple :
Code Java : | S�lectionner tout |
textField.setTextFormatter(integerOnlyFormatter);
La classe TextFormatter permet d'effectuer deux fonctions distinctes :
- le filtrage des modifications apport�es au contenu du contr�le de saisie (ex. : �viter la saisie de certains caract�res) ;
- convertir le texte saisi dans le contr�le par l'utilisateur en une valeur de type V qui sera contenue dans la propri�t� value du formateur. Dans le cas o� le programmeur modifie la propri�t� value du formateur, celui-ci convertira alors la valeur en texte � afficher dans le contr�le de saisie.
Il est possible d'avoir un formateur qui supporte l'une ou l'autre de ces fonctions ou les deux en fonction du constructeur de la classe que vous utiliserez.
Note : si jamais le formateur ne dispose pas de convertisseur, une exception de type IllegalStateException sera lev�e lorsque la m�thode setValue() est invoqu�e et sa propri�t� value est toujours � la valeur null.
Attention : il n'est pas possible de partager une m�me instance d'un formateur entre plusieurs contr�les de saisie.
Pour placer un filtre sur un formateur, vous devez, lors de son initialisation, lui fournir une instance de l'interface java.util.function.UnaryOperator<TextFormatter.Change> dans un de ses constructeurs. Vous devez impl�menter la m�thode apply() de l�op�rateur unaire pour impl�menter le filtrage.
Dans le corps de cette m�thode, vous pouvez tester les caract�res saisis dans le champ d��dition et valider ou non la modification en fonction de l'objet change re�u en param�tre de la m�thode. Si la modification doit �tre invalid�e, il vous suffit de retourner la valeur null. Dans le cas contraire, si la modification doit �tre valid�e, vous pouvez retourner l'objet change directement.
Par exemple :
Code Java : | S�lectionner tout |
1 2 3 4 5 6 7 8 9 | final UnaryOperator<TextFormatter.Change> integerOnlyFilter = new UnaryOperator<TextFormatter.Change>() { @Override public TextFormatter.Change apply(TextFormatter.Change change) { final String text = change.getText(); return (text.isEmpty() || text .matches("[0-9]")) ? change : null; } }; final TextFormatter<Integer> integerOnlyFormatter = new TextFormatter(integerOnlyFilter); |
Ou :
Code Java : | S�lectionner tout |
1 2 3 4 5 | final UnaryOperator<TextFormatter.Change> integerOnlyFilter = change -> { final String text = change.getText(); return (text.isEmpty() || text .matches("[0-9]")) ? change : null; }; final TextFormatter<Integer> integerOnlyFormatter = new TextFormatter(integerOnlyFilter); |
Ici, nous rejetons tout caract�re qui n'est pas un chiffre, il est donc d�sormais impossible de saisir dans le champ d��dition des lettres, symboles, etc. Nous acceptons cependant les modifications qui ne contiennent pas de texte de mani�re � permettre les changements de position du curseur de saisie ou de s�lection de texte dans le champ d��dition. Nous avons donc cr�� un filtre qui ne permet de saisir que des nombres entiers positifs.
Il est possible de retrouver le texte d'origine non modifi� du contr�le d��dition en invoquant la m�thode getControlText() de l'objet change re�u en param�tre de la m�thode.
De plus, il est �galement possible de connaitre la valeur future du texte contr�le d��dition en cas de validation de la modification en invoquant la m�thode getControlNewText() de l'objet change re�u en param�tre de la m�thode.
Note : un m�me filtre peut �tre utilis� par plusieurs formateurs.
Pour placer un convertisseur sur un formateur, vous devez, lors de son initialisation, lui fournir une instance de la classe abstraite javafx.util.StringConverter<T> dans un de ses constructeurs. Vous devez impl�menter les m�thodes fromString() et toString() de la classe pour convertir une chaine de caract�res provenant du contr�le de saisie en objet de type T ou un objet de type T en texte � afficher dans le contr�le de saisie.
Par exemple :
Code Java : | S�lectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 | final StringConverter<Integer> integerConverter = new StringConverter<Integer>() { @Override public String toString(Integer value) { return (value == null) ? null : value.toString(); } @Override public Integer fromString(String text) { return (text == null || text.trim().isEmpty()) ? null : Integer.parseInt(text.trim()); } }; final TextFormatter<Integer> integerOnlyFormatter = new TextFormatter(integerConverter, 0, integerOnlyFilter); |
Ici, nous avons plac� dans notre formateur un convertisseur qui permet de g�n�rer et d'utiliser des nombres entiers. Nous avons �galement sp�cifi� la valeur par d�faut dans le formateur. Nous avons �galement utilis� le filtre pr�c�demment cr��.
La m�thode fromString() du convertisseur est invoqu�e lorsque l'utilisateur tente de valider le contenu de son champ d��dition, par exemple en appuyant sur la touche ENTR�E � la fin de la saisie ou lorsque le champ d��dition perd le focus lorsqu'on a cliqu� ailleurs dans l'interface ou qu'on utilise une touche pour changer le contr�le actif (ex. : la touche Tabulation).
La m�thode toString() du convertisseur est invoqu�e lorsque le programmeur utilise le setter de la propri�t� value du formateur.
Note : un m�me convertisseur peut �tre utilis� par plusieurs formateurs.
� partir du JDK8_40, pour cr�er un bouton fl�ch� (spinner en anglais), il vous faut cr�er une instance de la classe javafx.scene.control.Spinner<T>. Ici, T est le type des instances contenues dans le spinner.
Par exemple :
Code Java : | S�lectionner tout |
final Spinner spinner = new Spinner();
Cependant l'instance de la classe Spinner ainsi cr��e est vide et n'accepte aucune valeur, car elle n'est pas �ditable.
Vous pouvez permettre la modification de la valeur du bouton fl�ch� en modifiant la valeur de sa propri�t� editable et en lui donnant la valeur true.
Code Java : | S�lectionner tout |
spinner.setEditable(true);

Pour peupler un bouton fl�ch�, vous pouvez l'initialiser en lui passant une liste de valeurs potentielles lors de sa cr�ation :
- il est possible de passer au constructeur une ObservableList<T> contenant les instances des valeurs l�gales pour le spinner.
Par exemple :Code Java : S�lectionner tout final Spinner<String> spinner = new Spinner(FXCollections.observableArrayList("Fabrice", "John", "Pierre"));
Ici, le bouton fl�ch� contient des chaines de caract�res pr�d�finies et sa valeur initiale est ��Fabrice��. Il est possible d'utiliser les fl�ches haut et bas pour naviguer entre les valeurs.
Attention : si le bouton est �ditable, il est possible de saisir de nouvelles valeurs, cependant celles-ci ne seront pas automatiquement rajout�es dans la liste des valeurs pr�d�finies. - Dans le cas de nombres entiers ou de nombres flottants, il est possible de sp�cifier une plage de valeurs l�gales.
Par exemple :Code Java : S�lectionner tout final Spinner<Integer> spinner = new Spinner(0, 10, 5);
Ou encore :Code Java : S�lectionner tout final Spinner<Double> spinner = new Spinner(0d, 10d, 5d);
Ici, le bouton fl�ch� contient la valeur initiale 5 et permet de naviguer dans une plage de valeurs comprises entre 0 et 10 par incr�ment de 1.
Il est cependant possible de sp�cifier le pas d�incr�ment dans le constructeur :
Par exemple :Code Java : S�lectionner tout final Spinner<Integer> spinner = new Spinner(0, 10, 5, 2);
Ou encore :Code Java : S�lectionner tout final Spinner<Double> spinner = new Spinner(0d, 10d, 5d, 2d);
Ici, le bouton fl�ch� contient la valeur initiale 5 et permet de naviguer dans une plage de valeurs comprises entre 0 et 10 par incr�ment de 2.
Attention : si le bouton est �ditable, il est possible de saisir de nouvelles valeurs, y compris des valeurs qui ne sont pas des nombres ou qui sont en dehors de la plage de nombres indiqu�e. - Enfin, il est possible de sp�cifier une usine � valeurs (value factory en anglais) en passant en param�tre du constructeur une instance de la classe javafx.scene.control.SpinnerValueFactory<T>. Il est �galement possible de sp�cifier une usine � valeurs en modifiant la valeur de la propri�t� valueFactory du bouton fl�ch�.
Il vous suffit alors de surcharger les m�thodes decrement() et increment() de cette classe de mani�re � modifier le contenu sa propri�t� value ce qui modifiera la valeur contenue dans le spinner.
Par exemple :Code Java : S�lectionner tout 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18final Spinner<Integer> spinner = new Spinner(new SpinnerValueFactory() { @Override public void decrement(int steps) { // D�cr�menter la valeur ici. final Integer value = (Integer)getValue(); final int val = (value == null) ? 0 : value; setValue(val - steps); } @Override public void increment(int steps) { // Incrementer la valeur ici. final Integer value = (Integer)getValue(); final int val = (value == null) ? 0 : value; setValue(val + steps); } });
Ici, nous cr�ons une fabrique � valeurs enti�res. Cependant, comme nous n'avons pas sp�cifi� de valeur initiale, le bouton fl�ch� est initialement vide. Pour pallier ce probl�me, il nous faudrait �galement surcharger le constructeur de la classe anonyme.
Par exemple :Code Java : S�lectionner tout 1
2
3
4
5
6
7final Spinner<Integer> spinner = new Spinner(new SpinnerValueFactory() { { setValue(5); } [...] });
Ici, le bouton fl�ch� est initialis� � la valeur 5.
Utiliser une telle fabrique permet par exemple de faire un spinner permettant de naviguer � travers un ensemble infini de valeurs num�riques, d'avoir un pas d�incr�ment non lin�aire (ex. : pass� une certaine valeur on saute de 10 en 10, puis de 100 en 100, etc.) ou encore de r�cup�rer des valeurs en effectuant une requ�te web ou aupr�s d'une base de donn�es.
La classe SpinnerValueFactory dispose de plusieurs impl�mentations/classes filles statiques pr�tes � l'emploi telles que IntegerSpinnerValueFactory, etc.
Attention : une fois de plus, si le bouton fl�ch� est �ditable, il peut accepter n'importe quelle valeur, m�me celles qui ne sont pas g�n�r�es par l'usine � valeurs.
Pour r�cup�rer la valeur d'un bouton fl�ch�, vous pouvez acc�der � sa propri�t� en lecture seule value.
Par exemple :
Code Java : | S�lectionner tout |
final Integer value = spinner.getValue();
Vous ne pouvez pas directement modifier la valeur d'un bouton fl�ch�. Cependant, vous pouvez invoquer ses m�thodes increment() et decrement() pour que le bouton interroge son usine � valeurs de mani�re � produire une nouvelle valeur qui sera alors appliqu�e au bouton. Il est possible de fournir un pas lorsqu'on invoque une de ces m�thodes.
Par exemple :
Code Java : | S�lectionner tout |
spinner.increment();
Ou :
Code Java : | S�lectionner tout |
spinner.decrement(10);
�videmment, il reste possible d'invoquer directement la m�thode setValue() sur l'usine � valeurs du spinner :
Code Java : | S�lectionner tout |
spinner.getValueFactory().setValue(5);
Pour restreindre l'�dition sur un bouton fl�ch�, vous devez sp�cifier un formateur dans la propri�t� textFormatter de l��diteur du bouton fl�ch�.
Par exemple :
Code Java : | S�lectionner tout |
spinner.getEditor().setTextFormatter(integerOnlyFormatter);
D�sormais, notre spinner ne permettra que la saisie de nombres entiers positifs.
-
Comment restreindre l'�dition sur un contr�le de saisie ? dans la FAQ JavaFX
Proposer une nouvelle r�ponse sur la FAQ
Ce n'est pas l'endroit pour poser des questions, allez plut�t sur le forum de la rubrique pour �aLes 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 � 2025 Developpez Developpez LLC. Tous droits r�serv�s Developpez LLC. Aucune reproduction, m�me partielle, ne peut �tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'� trois ans de prison et jusqu'� 300 000 � de dommages et int�r�ts.