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

EDT/SwingWorker Java Discussion :

Freeze interface, enregistrement dans BD


Sujet :

EDT/SwingWorker Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Décembre 2008
    Messages
    136
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 136
    Par défaut Freeze interface, enregistrement dans BD
    Bonjour,

    Voici mon probleme. J'ai une interface graphique en Swing.
    L'utilisateur a la possibilité de choisir des element dans une Jlist, puis, en cliquant sur un bouton, d'enregistrer ces informations dans une base de donnée. Le probleme que j'ai est que lorsque l'utilisateur clique sur le bouton d'enregistrement, l'interface freeze un court moment. Ce laps de temps est tres court, mais penible a la longue. Apres reflexion, je me suis dis que ceci devait etre relativement normal, etant donné que l'enregistrement se fait dans le meme thread que l'edt.
    Mon idee etait donc de creer un nouveau thread, dans lequel l'enregistrement est initialisé / effectué. Est-ce que quelqu'un pourrait confirmer / infirmer / péciser ceci, avant que je me lance dans la realisation, en me rendant peut-etre plus tard compte que ce n'etait absolument pas la bonne solution ?

    PS: je suis obligé de developper sous java 1.4, donc pas de swingworker !

    Merci d'avance !

    Cordialement

  2. #2
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par SebastianPx Voir le message
    Apres reflexion, je me suis dis que ceci devait etre relativement normal, etant donné que l'enregistrement se fait dans le meme thread que l'edt.
    Oui c'est tout à fait cela : pendant les quelques ms où tu enregistres dans la BD, l'EDT ne peut plus se mettre à jour.

    Toutes les tâches potentiellement longues ou bloquantes doivent être effectué en dehors de l'EDT !

    Citation Envoyé par SebastianPx Voir le message
    Mon idee etait donc de creer un nouveau thread, dans lequel l'enregistrement est initialisé / effectué. Est-ce que quelqu'un pourrait confirmer / infirmer / péciser ceci, avant que je me lance dans la realisation, en me rendant peut-etre plus tard compte que ce n'etait absolument pas la bonne solution ?
    Oui c'est tout à fait cela.
    Il faut juste penser que les mises à jours de l'affichage devront être faite dans l'EDT (via SwingUtilities.invokeLater() par exemple).


    Citation Envoyé par SebastianPx Voir le message
    PS: je suis obligé de developper sous java 1.4, donc pas de swingworker !
    Par contre ici tu es dans l'erreur !
    La classe SwingWorker a été remanié et intégré en standard dans Java 6, mais elle peut très bien être utilisé avec les versions précédente.

    • Le projet swingworker propose une implémentation similaire pour Java 5
    • Mais surtout la classe "existe" depuis 1998 dans les tutoriels de Sun (cf : Threads and Swing) : si elle n'est pas standard rien n'empêche d'intégrer son code source dans un de tes projets.
      C'est une version bien plus simpliste que celle de Java 6 et n'utilise pas les mêmes noms de méthode, mais c'est amplement suffisante dans la plupart des cas. Et sauf erreur cette classe est compatible avec du Java 1.2



    Ce qui donnerait l'utilisation suivante :
    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
    	// Si on est dans une méthode événementielle (dans actioPerformed() par exemple)
    	// Alors on est dans l'EDT (on peut vérifier cela via SwingUtilities.isEventDispatchThread())
     
    	// Ici tu pourrais modifier ta GUI (par exemple grisé un bouton, etc.)
     
    	// On crée notre SwingWorker :
    	new SwingWorker() {
     
    		public Object construct() {
    			// Cette méthode sera appelée une fois que le SwingWorker est lancé.
    			// Ce code sera exécuté dans un thread en tâche de fond
    			// Il pourra être lent ou bloquant sans que cela ne gène l'affichage
    			// Par contre on ne doit pas modifier l'affichage
    			// (il faudrait passer par SwingUtilitie.invokeLater())
     
    			// C'est ici que tu dois faire ta mise à jour de la BD
     
    			return null; // On peut éventuellement retourner un résultat
    		}
     
    		public void finished() {
    			// Cette méthode sera appelée une fois que la méthode construct() est terminé
    			// Ce code est exécuté dans l'EDT et permet de mettre à jour l'affichage
    			// à la fin du traitement...
     
    			// Par exemple tu pourrais réactiver le bouton, etc...
    		}
    	}.start(); // Et on n'oublie pas de lancer le thread ;)

    A la rigueur tu pourrais y ajouter des méthodes publish()/process() simpliste :
    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
        /**
         * La méthode publish() peut être appellée depuis construct()
         * pour "passer" une valeur à l'EDT. En fait cette méthode
         * va appeller la méthode process() dans l'EDT...
         * @param value
         */
        protected final void publish(final Object value) {
        	SwingUtilities.invokeLater(new Runnable() {
        		@Override
        		public void run() {
        			process(value);
        		}
        	});
        }
     
        /**
         * Lorsqu'on utilise publish() on doit redéfinir
         * process() qui s'occupera de traiter la valeur.
         * Cette méthode est appellé dans l'EDT de manière
         * indirect par publish()
         * @param value
         */
        protected void process(Object value) {
        	// à implémenter dans les classes filles
        }
    a++

  3. #3
    Membre confirmé
    Inscrit en
    Décembre 2008
    Messages
    136
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 136
    Par défaut
    Merci beaucoup ! Ca marche parfaitement
    Voila qui m'enleve une bonne epine du pied. Merci encore !

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

Discussions similaires

  1. enregistrer mon interface graphique dans un dossier
    Par nini_python dans le forum Tkinter
    Réponses: 5
    Dernier message: 10/07/2012, 10h30
  2. [LG]supprimer un enregistrement dans un fichier
    Par Marcus2211 dans le forum Langage
    Réponses: 10
    Dernier message: 17/11/2003, 01h59
  3. Insertion enregistrement dans table
    Par naidinp dans le forum ASP
    Réponses: 13
    Dernier message: 11/09/2003, 10h56
  4. [VB6] Supprimer un enregistrement dans une ListView ??
    Par Argonz dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 14/11/2002, 10h37
  5. enregistrer dans un fichier avec une appli mdi
    Par ferrari dans le forum C++Builder
    Réponses: 4
    Dernier message: 05/05/2002, 16h17

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