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 :

Équivalent d'un CellEditorListener pour un JTextField


Sujet :

AWT/Swing Java

  1. #1
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2008
    Messages
    17
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2008
    Messages : 17
    Points : 22
    Points
    22
    Par défaut Équivalent d'un CellEditorListener pour un JTextField
    Bonjour à tous,

    Je cherche à détecter la fin de l'édition dans un JTextField.

    Actuellement j'ai ajouté un DocumentListener à mon JtextField, ce qui me permet de savoir quad la personne ajoute ou retire un caractère. En fonction de la saisie, je met à jour une JTable de plusieurs centaines de lignes. Or mettre à jour cette JTable à chaque nouveau caractère pompe pas mal de ressource et je souhaiterais l'éviter.
    De plus, je peux bien sur attendre que l'utilisateur fasse "Entrée" après avoir édité une case en utilisant un ActionListener, mais j'aimerais aussi l'éviter, cela rendrait le formulaire plus pratique

    Je me demandais donc s'il existait un type de Listener que je ne connaitrais pas, qui permettrait de détecter la fin d'édition dans un JTextField (en gros une fois que la personne a arrêté de saisir depuis 1 seconde). Un équivalent de CellEditorListener mais pour un JTextField ?

    Quelqu'un aurait une idée à ce sujet ?

    Merci d'avance,

    Cdt

  2. #2
    Modérateur

    Homme Profil pro
    Développeur java, access, sql server
    Inscrit en
    Octobre 2005
    Messages
    2 710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur java, access, sql server
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 710
    Points : 4 794
    Points
    4 794
    Par défaut
    Peut-être ajouter un FocusListener qui
    - initialise une variable lastUpdate de type "long" avec zéro comme valeur initiale.
    - lance un thread qui surveille la variable lastUpdate.

    Tant que lastUpdate est à zéro, le thread ne fait rien.
    Dès que l'utilisateur tape quelque chose, le DocumentListener crée une nouvelle variable modif de type Date.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Date modif = new Date();
    lastUpdate = modif.getTime()
    à partir de là, on a le moment de la dernière modif (en millisecondes)
    comme lastUpdate n'est plus à zéro, le thread peut calculer le nombre de millisecondes ente lastUpdate et maintenant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Date maintenant = new Date();
    if ((maintenant.getTime()-lastUpdate) > 1000) ... remplir la JTable ;
    lastUpdate = 0; // raz en attente du prochain caractère
    cela revient à installer un chrono qui déclenche une action au bout d'une seconde.
    Il y a aussi la classe Timer qui fait ce genre de travail.
    Labor improbus omnia vincit un travail acharné vient à bout de tout - Ambroise Paré (1510-1590)

    Consulter sans modération la FAQ ainsi que les bons ouvrages : http://jmdoudoux.developpez.com/cours/developpons/java/

  3. #3
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2008
    Messages
    17
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2008
    Messages : 17
    Points : 22
    Points
    22
    Par défaut
    Salut,

    Merci pour ta réponse, tu m'as donné une idée à partir du Timer

    Voici ce que j'ai utilisé :
    Dès que j'ai un évènement (insertion ou suppression de caractère), j'annule les demandes de mise à jour planifiées par le timer, et j'en programme une autre 1 seconde plus tard. Cela m'évite donc de mettre à jour mon tableau de manière intempestive.

    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
     
    	@Override
    	public void insertUpdate(DocumentEvent e) {
     
    		// Planifie une nouvelle mise à jour
    		update();
     
    	}
     
    	private static class UpdateTimertask extends TimerTask {
     
    		@Override
    		public void run() {
     
    			MaClasse.update();
     
    		}
     
    	}
     
    	private void update() {
     
    		// Annule les mise à jour précédentes
    		timer.cancel();
    		Date date = Calendar.getInstance().getTime();
    		date.setTime(date.getTime()+1000);
    		// Planifie une mise à jour une seconde plus tard
    		timer.schedule(new UpdateTimertask(), date);
    	}
    Je sais pas si tout cela est très propre, mais vu que le programme est pour une utilisation personnelle, du moment qu'à moi ça me va ...

    Merci beaucoup, sujet résolu.

  4. #4
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Sinon plus basiquement, la fin de l'édition d'un JTextField correspond plus ou moins à une perte de focus, donc un FocusListener devrait faire l'affaire. Et au niveau de l'utilisateur ça paraîtrait un poil plus logique, plutôt qu'un délais d'une seconde qui va potentiellement intervenir au milieu de sa saisie et plus ou moins provoquer une erreur.
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  5. #5
    Membre expérimenté Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Points : 1 608
    Points
    1 608
    Par défaut
    De mémoire il me semble qu'un ActionListener suffit pour déclencher une action lors de l'appui de la touche Entrée.

  6. #6
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Dans le cas d'un JFormattedTextField, il suffit d'un PropertyChangeListener sur le champs value. Pour un JTextField normal vu qu'un DocumentListener choppe un peu tout et n'importe quoi, voir plutot du cote d'un PropertyChangeListener sur le champ text.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

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

Discussions similaires

  1. methode pour reinialiser JTextField
    Par Asmod_D dans le forum Composants
    Réponses: 1
    Dernier message: 23/03/2007, 16h55
  2. SAMBA - équivalent des [HOME] mais pour les groupes
    Par Filou07 dans le forum Administration système
    Réponses: 1
    Dernier message: 10/01/2007, 22h52
  3. [debutant] mettre resisable à faux pour un JTextField
    Par d_token dans le forum Composants
    Réponses: 7
    Dernier message: 28/07/2006, 11h55
  4. cherche équivalent librairie C++ linux pour windows
    Par jejerome dans le forum Bibliothèques
    Réponses: 3
    Dernier message: 01/03/2006, 19h49
  5. Existe-t-il un équivalent de terminal server pour Windows?
    Par kikica dans le forum Autres Logiciels
    Réponses: 1
    Dernier message: 27/08/2005, 18h09

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