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

Interfaces Graphiques en Java Discussion :

Consommation d'événement graphique


Sujet :

Interfaces Graphiques en Java

  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 107
    Par défaut Consommation d'événement graphique
    Bonjour à tous,

    Voila ca fait un moment que je me casse la tête à trouver un moyen pour que mon application, s'arrête là ou elle se trouve, consomme tous les évènements graphique et reprend là ou elle c'était arrêté.

    petit exemple :

    Je suis dans un ActionListener() juste après un clique d'un bouton.

    l'action met 5 minutes à se faire (c'est un exemple hein).

    et dedans j'aimerais pouvoir dire à mon appli stop toi, et consomme/réalise tous ce que tu as.

    Est ce possible?

  2. #2
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Par défaut
    Je ne comprends pas ton problème.
    Par contre, si l'action dans un listener est longue, il faut passer par un thread sinon tu figes ton interface.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 107
    Par défaut
    En gros je sais que java consomme les evenements que quand il sort du listener.

    Genre quand on clique sur un bouton, les évènements graphique ne se font que lorsque mon pointeur sors de l'action du clique.

    Et moi j'aimerais que je consomme l'intégralité des évènements de toutes mon appli à tous moment même quand je suis dans une action de clique. En gros faire une consommation de tous les évènements qui sont en attente dans la pile des évènements.

  4. #4
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Par défaut
    Selon ton problème initial, il y a peut-être plus simple.
    Que cherches-tu à faire au final ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 107
    Par défaut
    A cause du multi tache j'ai besoin de consommer les évènements.

    Ce que je voudrais savoir c'est, est ce qu'il y a une instruction en java, qui permettrait de susprendre la tâche en cours tant qu'il y a des évènements à consommé. Et une fois les évènements consommé, il retourne à la tache suspendus.

    Dans le principe, lorsque je scrute les appuie de touche clalvier, je peux appeler la fonction consume() qui me permet de ne pas dispatch mon évènement et de le consommé directement.
    Et bien j'aimerais la réalisation des évènements, et donc les consume, associé. J'ai reussi à faire un semblant en appelant la fonction updateUI(), mais ca ne fait pas exactement ce que je veux. ( met juste a jour le graphique)

    Voila par exemple je suis dans un onClick d'un jButton

    et en plein milieu je veux faire un repaint()

    Et bien je voudrais réalisé et consommé les évènements juste apres le repaint()

  6. #6
    Membre Expert 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
    Par défaut
    Je ne sais pas si ça répondra à ta question, mais tu peux installer ta propre file des événements :
    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
    	public void installMyEventQueue() {
    		EventQueue myEventQueue = new MyEventQueue();
    		Toolkit.getDefaultToolkit().getSystemEventQueue().push(myEventQueue);
    	}
     
    	static class MyEventQueue extends EventQueue {
     
    		private boolean dispatch = true;
     
    		@Override
    		protected void dispatchEvent(AWTEvent event) {
    			if (dispatch) {
    				super.dispatchEvent(event);
    			}
    		}
     
    		public boolean isDispatch() {
    			return dispatch;
    		}
     
    		public void setDispatch(boolean dispatch) {
    			this.dispatch = dispatch;
    		}
    	}

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 107
    Par défaut
    Cette réponse est interessante je ne cherche pas a remplacé le gestionnaire actuel mais plutot à l'éxécuter.

  8. #8
    Membre Expert 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
    Par défaut
    Citation Envoyé par Rhadamenthys Voir le message
    Et bien je voudrais réalisé et consommé les évènements juste apres le repaint()

    je ne cherche pas a remplacé le gestionnaire actuel mais plutot à l'éxécuter.
    Justement il te faut avoir accès au gestionnaire d'événements pour les dispatcher ultérieurement (et non au fur et à mesure qu'ils arrivent)

  9. #9
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 107
    Par défaut
    Justement je ne veux pas les dispatcher ulterieurement. Et je veux consommé ceux qui sont actuellement en attente dans la file d'évènement.

    voila un petit exemple :

    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
     
    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
     
            jLabel1.setText("01");
            System.out.println("repaint 1");
     
            //la fonction de consommation des évènements
            try {
     
                Thread.sleep(2000);
            } catch (InterruptedException ex) {
            }
            jLabel1.setText("02");
            System.out.println("repaint 2");
    }
    Voila le soucis c'est que la mon label ne prend pas la valeur 1 et passe tout de suite à 2
    La fonction update(this.getGraphics()) consomme tous les évènements graphique du JFrame et revient à la tâche suspendus.

    Mais moi je voudrais faire comme un update mais pour tous les types d'évènements.

  10. #10
    Membre Expert 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
    Par défaut
    Dans ton code, tu ne peux pas consommer les événements puisque tu bloques l'EDT pendant 2s avec sleep(). Si tu veux retarder la prise en compte d'une mise à jour de l'UI (pour le 2è setText()), passe par un javax.swing.Timer

  11. #11
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 107
    Par défaut
    non ca c'est pour voir le changement de mon label. C'est mon code test ^^. Et c'est justement dans un cas comme ca que je veux consommé les évènements. Je réalise une action et en plein milieu de mon action je veux consommé les évènements.

    Et je sais qu'en C c'est possible. Et de plus le upgrade montre que c'est possible avec les évènements graphique. Donc je voudrais savoir si il y a une fonction adapté pour ce que je veux faire.

  12. #12
    Membre Expert 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
    Par défaut
    Si ton code est exécuté dans l'EDT, les événements seront consommés lorsque tu quitteras la méthode ; sinon tu les consommes en implémentant ton propre gestionnaire (Cf. le message plus haut).

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

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Que veux tu faire en fait, bloquer toute action pour les utilisateurs tant que ta tâche n'est pas terminée?

  14. #14
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 107
    Par défaut
    Utilisateur bloqué ou pas ce n'est pas un problème. Je veux juste savoir si il est possible de consommé tous les évènements qui ont étaient inscrit dans la file des évènements.

    Une fonction qu'on peux appeler à tous moment et qui mettra l'évènement en cours en attente et ira réaliser tous les évènements disponible dans la file. Et une fois la file vide, reprend l'évènement mis en attente, là ou je me trouvais avant l'appel de la fonction.

    Peu etre que c'est anti java ce que j'essaye de faire. Je sais qu'en C++ c'est possible.

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

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Ta tâche en cours s'effectue dans un Thread à part je suppose?

  16. #16
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 107
    Par défaut
    non je suis dans un évènement EDT (OnClick) où j'éxecute du code.

    Ce code génère des évènements, (clavier, paint, souris, fire ...etc)

    J'aimerais suspendre cet évènement(mon OnClick) et aller consomer tous les évènements généré juste avant.

    Une fois les évènements consommé, il reviens à mon code suspendus afin de terminer les instructions restantes.

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

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Tu fais ton action longue dans un thread, comme cela toutes tes interactions avec l'interface graphique continueront à être exécutées sans le moindre problème en parallèle.

  18. #18
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 107
    Par défaut
    toutes tes interactions avec l'interface graphique continueront à être exécutées sans le moindre problème en parallèle
    Justement, je ne veux pas avoir que les évènements graphique. De plus en faisant un update(), j'arrive à consommé les évènements graphique. Moi je veux consommé tous les évènements de tous types !

    Mais je ne sais pas si on peux le faire en java.

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

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    À quoi cela servirait-il?
    J'ai vraiment du mal à comprendre là finalité de ce truc. À mon avis tu es trop focalisé sur cette notion de consommation d'événements.
    De toute façon tu fais une tâche longue dans l'edt, ce qui est mauvais par essence.

  20. #20
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 107
    Par défaut
    voila j'ai un petit exemple simple :
    Ce programme affiche un compteur qui s'incrémente toute les secondes et l'affiche dans un JTextField. Arrivé à 10 il s'arrete.

    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
     
    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
            new Thread( new Runnable() {
     
                public void run() {
     
                    for (int i=1;i<10;i++) {
                        jTextAff.setText("Pos :"+i);
                        try {
                            Thread.sleep(1000);
                        } catch (InterruptedException ex) {
                            Logger.getLogger(EssaiThread.class.getName()).log(Level.SEVERE, null, ex);
                        }
                    }
                }
            }).start();
     
        }
    Dans ce cas là, tous fonctionne correctement.

    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
     
    private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton2ActionPerformed
            java.awt.EventQueue.invokeLater(new Runnable() {
                public void run() {
                     for (int i=1;i<10;i++) {
                        jTextAff.setText("Pos :"+i);
                        //jTextAff.getParent().update(jTextAff.getParent().getGraphics());
                        try {
                            Thread.sleep(1000);
                        } catch (InterruptedException ex) {
     
                        }
                    }
                }
            });
        }
    Dans ce cas là, le invokeLater bloque l'interface attendant que mon code se termine. De plus la mise a jour de l'affichage ne se réalise pas. C'est dans ce cas précis que j'aimerais pouvoir consommer les évènements de la file, ainsi l'affichage se remettrait à jour en consommant l'evenement repaint() générer par la méthode setText().

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /jTextAff.getParent().update(jTextAff.getParent().getGraphics());
    C'est vrai que cette instruction me permettrait de mettre a jour mon JTextField. Mais si il s'agis d'un autre type d'évènement (Par exemple un KeyEvent) j'aimerais aussi pouvoir le consommé.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 11
    Dernier message: 21/04/2008, 12h23
  2. [JpGraph] Ajouter des évènements au graphique
    Par Foudébois dans le forum Bibliothèques et frameworks
    Réponses: 3
    Dernier message: 07/05/2007, 18h06
  3. Créer un événement non graphique
    Par Thorna dans le forum Général Java
    Réponses: 4
    Dernier message: 23/04/2007, 12h52
  4. Objet graphique réagissant à des événements
    Par Mayhem dans le forum Graphisme
    Réponses: 5
    Dernier message: 05/06/2006, 08h36

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