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

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

AWT/Swing Java Discussion :

vérification d'une zone de texte et requestFocus()


Sujet :

AWT/Swing Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de nadsky
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2007
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2007
    Messages : 118
    Par défaut vérification d'une zone de texte et requestFocus()
    Bonjour à tous,

    Après recherche google et sur le forum, je fais appel à votre aide, car je ne comprends absolument pas les exemples que je trouve (et qui de plus, ne marchent pas toujours...).

    Voila, je suis en train de créer une appli de conversion d'un standard XML vers un autre standard XML.
    Pour décrire rapidement, je passe en entrée le chemin d'un fichier XML à traduire vers l'autre standard XML.

    L'appli en elle-même marche parfaitement, mais je souhaiterais l'optimiser.

    En effet, j'ai actuellement un bouton Verification qui permet de contrôler ce qui est passé en entrée, et permet de voir s'il s'agit bien d'un fichier XML, si le champ est vide...tout cela est parfaitement fonctionnel.
    J'ai donc crée une classe afin d'écouter ce bouton avec la méthode ActionPerformed associée et tout le code de vérification se trouve dans cette méthode.

    J'aimerais désormais me passer de ce bouton et garder la vérification qui était faite par ce bouton, mais directement lorsque l'utilisateur souhaite quitter cette zone de texte (je rappelle, la zone de texte dans laquelle il passe le chemin du fichier d'entrée qu'il souhaite traduire).

    J'ai testé requestFocus() appliquée à ma zone de texte, et j'ai copié le code de mon bouton de vérification dans le corps de cette méthode, mais aucune vérification n'est faite.

    J'ai également conservé la classe qui écoutait mon bouton (donc avec tout le code de vérification), et appelé la méthode addActionListener depuis cette zone de texte, mais rien n'a changé.

    Pourriez-vous m'aider ou me donner quelques pistes s'il vous plait??

    Je vous remercie d'avance

  2. #2
    Membre Expert
    Avatar de visiwi
    Profil pro
    Inscrit en
    Février 2008
    Messages
    1 050
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 1 050
    Par défaut
    Salut,

    Tout dépend de ce que tu entends par :
    lorsque l'utilisateur souhaite quitter cette zone de texte
    Si tu veux déclencher ta vérification lors de la perte de focus de ton JTextField, il suffit d'écouter le composant avec un FocusListener :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    JTextField textF = new JTextField();
    textF.addFocusListener(new FocusAdapter() {
    	@Override
    	public void focusLost(FocusEvent e) {
    		System.out.println("focusLost");
    	}
    });
    requestFocus est utilisé pour donner le focus au composant.

  3. #3
    Membre confirmé Avatar de nadsky
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2007
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2007
    Messages : 118
    Par défaut
    merci à toi pour ta solution, j'ai cependant quelques petites choses à te demander :
    - lorsque je crée la méthode que tu m'as indiquée, j'ai le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
     
    txtlocalPath.addFocusListener(new FocusAdapter() {
            	@Override
            	public void focusLost(FocusEvent e) {
            		/*btntradsimple.setEnabled(false);
    			btntradcomplique.setEnabled(false);			
     
    			/*Utilisation d'un parser DOM ou SAX sans DTD ou xml schema pour la validation,
    			 * s'il ya une erreur de parsing alors le fichier XML n'est pas bien formé càd NON XML.
    			 */
    			DocumentBuilderFactory fabrique = DocumentBuilderFactory.newInstance();			
    			DocumentBuilder constructeur;
    			try {
     
    				if(txtlocalPath.getText().length()==0){
    					JOptionPane jop1 = new JOptionPane();
    					jop1.showMessageDialog(null, "Veuillez saisir un fichier de sortie d'extension .xml ", "Information", JOptionPane.INFORMATION_MESSAGE);
    					txtlocalPath.requestFocus();
    				}
    				else{
    			constructeur = fabrique.newDocumentBuilder();
     
    			// lecture du contenu d'un fichier XML avec DOM
    			File xml = new File(decoupeURL());
    			Document document;			
    			document = constructeur.parse(xml);
     
    			/*on se place sur la racine, on vérifie alors :
    			 * - soit que le fichier d'entrée est un document ebXML
    			 * -soit que le fichier d'entrée est un document XML simple
    			 * - soit ni l'un ni l'autre, alors erreur...
    			*/
    			Node racine = document.getDocumentElement();
    			String nomRacine = racine.getNodeName();
     
     
    				if(nomRacine=="Dematerialisation_prix" && (getFileExtension(txtSortie.getText())).compareTo("xml")==0){
    					btntradcomplique.setEnabled(true);
    					btntradsimple.setEnabled(false);
    				}
    				else if(nomRacine=="itt:InvitationToTenderDetails" && (getFileExtension(txtSortie.getText())).compareTo("xml")==0){
    					btntradcomplique.setEnabled(false);
    					btntradsimple.setEnabled(true);
    				}
    				else if (txtSortie.getText().length()==0 || (getFileExtension(txtSortie.getText())).compareTo("xml")!=0){
    					JOptionPane jop1 = new JOptionPane();
    					jop1.showMessageDialog(null, "Veuillez saisir un fichier de sortie d'extension .xml ", "Information", JOptionPane.INFORMATION_MESSAGE);
     
    				}
     
    			  }
    			}
    			catch (ParserConfigurationException e1) {
    				// TODO Auto-generated catch block
    				e1.printStackTrace();
    			}			
    			catch (SAXException e1) {
    				// TODO Auto-generated catch block
    				e1.printStackTrace();
    			} catch (IOException e1) {
    				// TODO Auto-generated catch block
    				JOptionPane error = new JOptionPane();
    				error.showMessageDialog(null, "Le fichier n'est ni un ebXML, ni un XML simple. Veuillez saisir un fichier.xml", "Erreur", JOptionPane.ERROR_MESSAGE);
    			}
            	}
            });
    seulement, voila, quand je ne saisis rien dans ma zone de texte (txtlocalPath : zone de texte où je saisis le document XML que je souhaite traduire), j'ai bien mon message d'erreur qui s'affiche, mais deux choses se présentent :
    - le message d'erreur (ma boite de dialogue) s'affiche 3 fois de suite, et je dois cliquer 3 fois de suite sur OK pour qu'elle ne s'affiche plus.

    - une fois que la boite de dialogue s'est affichée (3fois de suite), le focus est basé sur la 2e zone de texte.

    Faut-il passer par la méthode setFocus ou requestFocus (comme indiqué dans le post précédent) pour "forcer" le focus?

    Enfin, je n'ai pas pensé à l'écrire dans le premier post, mais j'ai un bouton parcourir qui permet d'aller chercher le fichier XML souhaité.Or, je dois bien entendu pouvoir cliquer dessus.Seulement le lostFocus est actif dès que l'on quitte la zone de texte.
    Comment appliquer ce lostFocus seulement si l'utilisateur veut cliquer dans la 2e zone de texte et ne pas l'appliquer ailleurs??

    Merci d'avance pour vos réponses, n'hésitez pas à me dire si j'ai mal expliqué quelque chose

  4. #4
    Membre Expert
    Avatar de visiwi
    Profil pro
    Inscrit en
    Février 2008
    Messages
    1 050
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 1 050
    Par défaut
    Citation Envoyé par nadsky Voir le message
    Enfin, je n'ai pas pensé à l'écrire dans le premier post, mais j'ai un bouton parcourir qui permet d'aller chercher le fichier XML souhaité.
    Est-ce que ça ne suffit pas ?
    Pourquoi avoir un JTextField (éditable) ?
    Car, si j'ai bien compris, il s'agit pour l'utilisateur de spécifier un fichier.
    Avec un JFileChooser, tu peux écrire un filtre qui permet de sélectionner seulement les fichiers que tu veux (avec l'extension). Il ne te resterait plus (si tu veux ce niveau de fiabilité) qu'à vérifier que le fichier est bien un fichier xml et non un fichier quelconque renommé avec son extension, dès que l'utilisateur à choisi un fichier.
    Après je ne connais pas ton projet, aussi ai-je peut-être un regard de conception naif.
    Mais c'est, je crois, plus simple et plus efficace, que de se lancer dans une conception plus complexe et donc moins fiable et coûteuse en terme d'effort.

  5. #5
    Membre confirmé Avatar de nadsky
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2007
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2007
    Messages : 118
    Par défaut
    oui, justement, j'ai spécifié ce filtre et tout contrôlé pour ce qui est des extensions, notamment le cas où un utilisateur aurait l'idée de créer un fichier .mp3 ou jpg qu'il renommerait en xml.
    Seulement, il m'est demandé dans mon projet de garder les zones de texte modifiables.
    Après, c'est sûr que je trouvais l'idée de mon bouton de vérification meilleure, mais je n'ai pas choisi cette optimisation.


    Pour revenir à mon problème initial, comment faire dans le cas où un message d'erreur s'affiche plusieurs fois de suite pour ne laisser à l'utilisateur que la première zone de texte de disponible et pas la deuxième??

    Merci d'avance

  6. #6
    Membre Expert
    Avatar de visiwi
    Profil pro
    Inscrit en
    Février 2008
    Messages
    1 050
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 1 050
    Par défaut
    Tu peux utiliser requestFocus pour demander que le focus soit déplacé sur le composant, oui. Ou une autre méthode du même type, je ne sais plus.

    Si t'as boite de de dialogue est affichée trois fois c'est que tu passe trois fois dans ton listener, ce qui n'est pas le comportement standard. Cherche ce qui pourrait l'appeler les deux autres fois.

    Sinon post un code que l'on puisse tester.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2010] Vérification de la valeur d'une zone de texte
    Par rattus34 dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 27/01/2013, 20h02
  2. Vérification d'une zone de texte
    Par bolbol bizerte dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 05/03/2011, 14h06
  3. [JTextArea ] Définir une zone de texte
    Par Katyucha dans le forum Composants
    Réponses: 8
    Dernier message: 17/11/2004, 23h32
  4. [HTML] Bloquer l'ecriture d'une zone de texte
    Par bouboussjunior dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 20/10/2004, 09h57
  5. Réponses: 9
    Dernier message: 26/04/2004, 21h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo