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 :

céer console de debug comme dans eclipse


Sujet :

AWT/Swing Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    1 854
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 1 854
    Par défaut céer console de debug comme dans eclipse
    Bonjour,

    J'ai créé un petit programme qui m'ouvre une fenêtre avec un bouton.
    Lorsque je clic sur le bouton, je lance un script => le script pendant son exécution écrit dans System.out et System.err pour donner des informations sur l'état de celui-ci.
    => le problème est que ces informations ne sont écrites que dans la console d'eclipse : comment faire pour qu'elles apparaissent aussi dans un JTestPane se trouvant dans ma fenetre ?

    Actuellement, la seule méthode que j'ai trouvé est de doubler les commandes d'information => pour chaque info, j'écris la même phrase dans System.out et dans mon JTestPane : c'est un peu lourd comme solution
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    str = "information x\r\n";
    console.setParagraphAttributes(console.getLength(), str.length(), boldStyle, true);
    console.insertString(console.getLength(), str, boldStyle);
    System.out.print(str);
    => n'y a t-il pas une solution plus élégante (n'avoir qu'une seule ligne) ?
    => Remarque : contrairement à la console d'eclipse, mon JTestPane ne se met à jour qu'a la fin de l'exécution du script : on ne peut pas le mettre à jour pendant l'exécution du programme ?

  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 boboss123 Voir le message
    Actuellement, la seule méthode que j'ai trouvé est de doubler les commandes d'information => pour chaque info, j'écris la même phrase dans System.out et dans mon JTestPane : c'est un peu lourd comme solution

    Citation Envoyé par boboss123 Voir le message
    => n'y a t-il pas une solution plus élégante (n'avoir qu'une seule ligne) ?
    Ben pour alléger le code il suffit d'en faire une méthode qui écriera son paramètre sur la console et dans ton JTextPane...

    Citation Envoyé par boboss123 Voir le message
    => Remarque : contrairement à la console d'eclipse, mon JTestPane ne se met à jour qu'a la fin de l'exécution du script : on ne peut pas le mettre à jour pendant l'exécution du programme ?
    Si : mais il faut respecter la règle du thread-unique pour l'affichage, et éviter de faire des traitements lourds dans l'EDT !

    Regarde du coté de la classe SwingWorker pour plus de détail...

    a++

  3. #3
    Membre chevronné
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    1 854
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 1 854
    Par défaut
    merci je viens de lire le tuto sur les SwingWorker.
    Mais étant débutant j'ai encore du mal à visualiser comment doit etre construit mon programme.

    Donc au départ j'ai deux classes :
    - myJFrame : défini la fenetre principale
    - myProcess : défini les actions que je dois faire


    Voici la structure des mes classes
    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
    public class myJFrame extends JFrame {
     
        // création des objets graphiques
        private JButton jb1 = new JButton("lancer");
        private JTextPane jtp1 = new JTextPane();
     
     
        // initialisation de l'objet myJFrame
        public myJFrame (){
           // définition de l'apparence de la fenetre
           ...
           ...
           ...
     
           // positionnement des éléments graphiques
           ....
           ....
           ....
     
           // création des ActionListener (gestion d'événements)
           ....
           ....
           ....
        }
     
        // appelé lorsque l'on clic sur le bouton
        private clicBouton{
     
            // création de l'objet
            myProcess mp1 = new myProcess();
     
           // lancement de l'execution de mon process
           mp1.run();
     
       }
     
    }

    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
    public class myProcess(){
     
        // initialisation de l'objet myProcess
        public myProcess(){
          ...
          ...
        }
     
     
        // lancement du process
        public run(){
          ...
          ...
          etatNormal("action x"); // indique l'etat de progression du process
          ...
          ...
          etatNormal("action x"); // indique l'etat de progression du process
          ...
          ...   
          etatNormal("action x"); // indique l'etat de progression du process
          ...
          ...
          if (erreur){
              etatErreur("action x"); // indique une erreur du process
          } else {
              etatNormal("action x"); // indique l'etat de progression du process
          }
          ...
          ...          
        }
     
     
        // affichage de l'etat
        private etatNormal(String str){
             System.out.println(str);
     
             // ecriture en noir dans la console 
             ....
             ....
        }
     
        // affichage de l'erreur
        private etatErreur(String str){
             System.err.println(str);
     
             // ecriture en rouge dans la console 
             ....
             ....
        }
     
    }
    Déjà la première question est comment dois-je renvoyer mes messages d'avancement si je veux que ma classe myProcess soit indépendante de tout ? dois-je créer un Stream qui contient tous mes messages puis créer une méthode qui permette de les récupérer (quel type d'objet utiliser) ?
    => Ne peut-on pas plus simplement faire une fonction qui récupère ce qu'il y a dans System.err et System.out et qui l'affiche dans mon JTextPane pendant le process ?

  4. #4
    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
    Citation Envoyé par boboss123 Voir le message
    merci je viens de lire le tuto sur les SwingWorker.
    Mais étant débutant j'ai encore du mal à visualiser comment doit etre construit mon programme.
    En fait, lorsque tu reçoit un évènement (clic de souris, etc.), tu es dans l'EDT, c'est à dire le thread chargé de gérer l'interface graphique.

    Ce thread ne doit être utilisé QUE pour mettre à jour l'affichage. En effet pendant que tu y fais tes traitements, il ne peut plus gérer l'affichage. Si ton traitement est trop long tu risque d'avoir une interface graphique figé...


    Pour éviter cela, il faut utiliser un thread pour exécuter le traitement en tâche de fond, puis des SwingUtilities.invokeLater() pour mettre à jour l'interface (car tes modifs de l'interface DOIVENT être fait dans l'EDT). Mais la classe SwingWorker est faite pour faciliter tout cela.
    SwingWorker

    Citation Envoyé par boboss123 Voir le message
    Déjà la première question est comment dois-je renvoyer mes messages d'avancement si je veux que ma classe myProcess soit indépendante de tout ? dois-je créer un Stream qui contient tous mes messages puis créer une méthode qui permette de les récupérer (quel type d'objet utiliser) ?
    Le plus simple serait d'utiliser un listener... non ?

    Citation Envoyé par boboss123 Voir le message
    => Ne peut-on pas plus simplement faire une fonction qui récupère ce qu'il y a dans System.err et System.out et qui l'affiche dans mon JTextPane pendant le process ?
    Tu peux redéfinir les System.out et System.err, mais c'est surement un peu plus complexe à faire...

    a++

  5. #5
    Membre chevronné
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    1 854
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 1 854
    Par défaut
    Ok merci pour les threads, j'avais compris : j'ai plutot un problème sur le passage de mes message d'erreur vers l'EDT

    Citation Envoyé par adiGuba Voir le message
    Le plus simple serait d'utiliser un listener... non ?
    => comment fais-tu (je n'en ai encore jamais créé...) ? n'aurais tu pas un petit exemple de code stp ?

  6. #6
    Membre chevronné
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    1 854
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 1 854
    Par défaut
    J'ai trouvé un bon tuto : http://rom.developpez.com/java-listeners/

    1- j'ai créé une interface :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    import java.util.EventListener;
     
    public interface StatusListener extends EventListener{
     
    	// message : message envoyé
    	// type : type du message (0: info, 1: erreur, ...)
        public void infoMessageDetected(String message, short type);
    }
    2- j'ai rajouté dans ma classe myProcess, la gestion de l'evenement :
    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
    	// ***********************************************************************
    	// Gestion des messages console (implementation de l'interface StatusListener que j'ai créée)
    	private final static EventListenerList listeners = new EventListenerList();
     
    	// gestion de l'ajout d'un ecouteur à la liste listeners
    	// => on peut ajouter plusieurs type de listener dans la liste (on lrepère leur type grace a  StatusListener.class)
        public void addStatusListener(StatusListener listener){
            listeners.add(StatusListener.class, listener);
        }
     
        // suppression d'un listener dans la liste
        public void removeStatusListener(StatusListener listener){
            listeners.remove(StatusListener.class, listener);
        }
     
        // recupère la liste de tous les abonnés
        public static StatusListener[] getStatusListener(){
            return listeners.getListeners(StatusListener.class);
        }
     
        // envoie de l'evenement
    	protected static void sendMessage(String message, short type){
     
    		switch(type){
    			case 0: // message d'info
    				System.out.println(message);
    				break;
     
    			default: // message d'erreur
    				System.err.println(message);
    		}
     
            for(StatusListener listener : getStatusListener()) {
            	listener.infoMessageDetected(message, type);
            }
     
    	}
    j'ai remplacé tous mes System.out et System.err par des sendMessage(...)
    => c'est bien comme ça qu'il faut faire ?

    petite question simple : comment fait-on pour la variable type, définir la valeur en utilisant une chaine de caractère au lieu d'un nombre ?

Discussions similaires

  1. accolades fermantes automatiques comme dans eclipse?
    Par olivier57b dans le forum Visual Studio
    Réponses: 1
    Dernier message: 11/05/2010, 11h18
  2. Console DOS dans Eclipse
    Par lionel84 dans le forum Eclipse
    Réponses: 4
    Dernier message: 10/09/2009, 16h40
  3. Soucis avec le debuger dans eclipse 3.2.2
    Par chenyou dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 24/05/2007, 11h38
  4. Console programme dans eclipse
    Par pobsteta dans le forum Eclipse Platform
    Réponses: 2
    Dernier message: 21/05/2007, 09h43
  5. console hibernate dans eclipse et fichier .hbm.xml
    Par BBruno dans le forum Hibernate
    Réponses: 2
    Dernier message: 31/08/2006, 09h33

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