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

 Java Discussion :

paintComponent() conditionnelle


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Décembre 2012
    Messages : 16
    Par défaut paintComponent() conditionnelle
    Bonjour,

    J'aimerais faire en sorte que les données puissent être insérées dans un JTextArea.

    J'analyse (avec des tests "if") ensuite à chaque cas, j'aimerais dessiner dans un JPanel son correspondant mais je ne vois pas la solution, ni comment faire ça avec avec paintComponent().

    Pour voir s'il y a une insertion, j'ai implémenté sur le JTextArea un DocumentListener et voila la classe :
    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
    67
    68
    69
    70
    71
    protected class MyDocumentListener extends JPanel implements javax.swing.event.DocumentListener
    {
        public String gettypeevent()
        {
            DocumentEvent documentEvent = null;
            DocumentEvent.EventType type = documentEvent.getType();
            return type.toString();
        }
     
        @Override
        public void changedUpdate(javax.swing.event.DocumentEvent e)
        {
            // text has been altered in the textarea
        }
     
        @Override
        public void insertUpdate(javax.swing.event.DocumentEvent e)
        {
            // text has been added to the textarea
            System.out.println(gettypeevent());
            try
            {
                // if not prompt Line
                if (!Traffic.getText(Traffic.getLineStartOffset(Traffic.getLineCount() - 1),
                        Traffic.getLineEndOffset(Traffic.getLineCount() - 1) - Traffic.getLineStartOffset(Traffic.getLineCount() - 1)).contains(">>"))
                {// if a line after a replace has been inserted
     
                    if (Traffic.getLineCount() == (lastreplace + 2))
                    {
                        System.err.println(Traffic.getText(Traffic.getLineStartOffset(lastreplace),
                                Traffic.getLineEndOffset(lastreplace) - Traffic.getLineStartOffset(lastreplace)));
                        // PortArchitecture (Traffic.getText(Traffic.getLineStartOffset(lastreplace),
                        // Traffic.getLineEndOffset(lastreplace) -
                        // Traffic.getLineStartOffset(lastreplace)));
     
                        lastreplace += 1;
                    }
                    else
                    {
                        // last line when it's not detected by the previous condition it'll be consumed here
     
                        System.err.println(Traffic.getText(Traffic.getLineStartOffset(lastreplace),
                                Traffic.getLineEndOffset(lastreplace) - Traffic.getLineStartOffset(lastreplace)));
                        // PortArchitecture (Traffic.getText(Traffic.getLineStartOffset(lastreplace),
                        // Traffic.getLineEndOffset(lastreplace) -
                        // Traffic.getLineStartOffset(lastreplace)));
                    }
                }
                Traffic.setCaretPosition(Traffic.getDocument().getLength());
            }
            catch (BadLocationException ex)
            {
                Logger.getLogger(TrafficSerialPort.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
     
        @Override
        public void removeUpdate(javax.swing.event.DocumentEvent e)
        {
            // text has been removed from the textarea
        }
     
        @Override
        protected void paintComponent(Graphics g)
        {
            System.out.println("fffffffffff");
            super.paintComponent(g);
            g.drawString("fffffffffff", 120, 60);
            System.out.println("fffffffffff");
        }
    }
    J'ai essayé d'appeler une méthode "PortArchitecture(..)" qui va dessiner ce que je veux et j'ai utilisé getGraphics() mais on m'a dit qu'il ne fallait pas, il faut utiliser paintComponent().

    Quelqu'un saurait-il m'indiquer comment faire ?

    Merci d'avance pour votre aide.

  2. #2
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2004
    Messages
    1 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 184
    Par défaut
    Bonjour,

    Ton message n'est vraiment pas clair, un petit effort sur le français te donnera plus de chances d'avoir des réponses.

    Voici ce que j'ai compris :
    - Tu as un JTextArea dans lequel tu saisis des choses (On ne sait pas quoi)
    - En fonction de ce qui est saisi, tu veux le dessiner dans un JPanel

    J'ai donc plusieurs questions :
    1 - Qu'est-ce que tu saisis dans ton JTextArea ?
    2 - Pourquoi un JTextArea et pas un JTextField ?
    3 - Est-ce qu'à chaque nouvelle saisie tu veux dessiner seulement la dernière ou l'ensemble des saisies ?

    Sinon, oui pour dessiner dans un JPanel il faut bien utiliser :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    protected void paintComponent (Graphics g)

  3. #3
    Membre averti
    Homme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Décembre 2012
    Messages : 16
    Par défaut
    merci pour votre réponse rapide.
    donc :
    1.j'insert de trafic venant d'un port série donc je sais pas quoi ce qui a été inséré c'est pour quoi je fais de test.
    je te donne un exemple : quand je reçoit "ON-HOOK" je mets dans le jpannel une image d'un téléphone accroché si je reçoit "OFF-HOOK" je mets une image d'un téléphone décroché
    ou bien quand je reçoit le numéro du port je le dessine aussi....

    2.je me souviens plus pourquoi j'ai mis JTextArea même ce problème a consommé toute ma énergie de souvenir :p

    3.je veux juste tester sur chaque ligne et dessine ce que ce ligne correspond ==> encours d'insertion je fais mon opération de dessin.

  4. #4
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2004
    Messages
    1 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 184
    Par défaut
    Ok voici une piste pour le dessin :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    protected void paintComponent (Graphics g) {
          Pour chaque ligne du JTextArea {
                Si(ON-HOOK) {
                        Dessiner téléphone accroché
                }Sinon Si(OFF-HOOK) {
                        Dessiner téléphone déccroché
                }
                ....
          }
    }
    Ensuite pour déclencher l'appel à paintComponent il faut que sur un listener du JTextArea tu fasse quelque chose comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    monPanelDeDessin.repaint();  // Provoque appel à paintComponent (..)

  5. #5
    Membre averti
    Homme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Décembre 2012
    Messages : 16
    Par défaut
    J'ai fais ce que tu m'a dit : j'ai ajouté au class MyDocumentListener la methode paintComponent() :
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
            @Override
       protected void paintComponent (Graphics g)
              {
     
                super.paintComponent(g);
                Graphics2D gfx = (Graphics2D)g;
                gfx.drawString("fffffffffff", 120, 60);
                System.out.println("fffffffffff");
              }

    et j'ai ajouté aussi au methode insertUpdate "graphicPanel.repaint()" (graphicPanel est le nom du JPanel ou je vais dessiner)

    Code java : 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
    public void insertUpdate(javax.swing.event.DocumentEvent e) 
      {
             // text has been added to the textarea 
         try { 
    
             if  (!Traffic.getText(Traffic.getLineStartOffset(Traffic.getLineCount()-1),Traffic.getLineEndOffset(Traffic.getLineCount()-1)-Traffic.getLineStartOffset(Traffic.getLineCount()-1)).contains(">>"))
             {
    
               if (Traffic.getLineCount()  == (lastreplace + 2) ) 
               {
                   System.err.println(Traffic.getText(Traffic.getLineStartOffset(lastreplace),Traffic.getLineEndOffset(lastreplace) - Traffic.getLineStartOffset(lastreplace)));
                lastreplace +=1;
                                                graphicPanel.repaint();
                }
    
    
              else
              {
                System.err.println(Traffic.getText(Traffic.getLineStartOffset(lastreplace),
                             Traffic.getLineEndOffset(lastreplace) - 
                                     Traffic.getLineStartOffset(lastreplace)));
              }
           }
            Traffic.setCaretPosition(Traffic.getDocument().getLength());
    
         } catch (BadLocationException ex) {
             Logger.getLogger(TrafficSerialPort.class.getName()).log(Level.SEVERE, null, ex);
         }
    
     }

    Mais sa marche pas ni le System.out.println("fffffff"); du paintComponent marche ni l'affichage sur le JPanel.
    Question : est ce que quand j'appel paintComponent() avec graphicPanel.repaint() sait qu'elle va dessiner sur ce JPanel->graphicPanel?

  6. #6
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2004
    Messages
    1 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 184
    Par défaut
    Ton code n'est vraiment pas clair, il y a objet graphicsPanel qui apparait, on ne sait pas d'où il sort. Découpe mieux ton projet plutôt que de tout mettre dans une classe.

    Tu dois avoir 3 classes :

    1 - Ton interface graphique (Panel global + JTextArea + Panel de dessin)
    2 - Ton JPanel de dessin pour y redéfinir la méthode paintComponent
    3 - Ton Listener


    Le problème dans ton cas c'est que tu appelles repaint sur graphicsPanel alors que c'est la méthode paintComponent de MyDocumentListener que tu a redéfinie.

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

Discussions similaires

  1. [STRUTS] [JAVA] Affichage conditionnel de bean:write
    Par babylone7 dans le forum Struts 1
    Réponses: 6
    Dernier message: 29/04/2004, 16h20
  2. suppression avec sous requête conditionnelle
    Par melmel dans le forum Requêtes
    Réponses: 8
    Dernier message: 18/03/2004, 23h20
  3. [CODE] Compilation conditionnelle ?
    Par Cornell dans le forum Langage
    Réponses: 3
    Dernier message: 16/09/2003, 18h16
  4. [XSL] déclaration conditionnelle
    Par Totsira dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 18/08/2003, 05h02

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