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

  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.

  7. #7
    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
    ok voila ce que j'ai fait :
    J'ai créer un JPanel avec Netbeans graphiquement donc le graphicPanel est declaré dans initComponents();
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    graphicPanel = new javax.swing.JPanel();
    ce que je comprend pas est est ce dois je faire un autre classe pour contenir la méthode paintComponent()? et comment paintComponent() va savoir qu'elle va dessiner dans graphicPanel?

  8. #8
    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
    Par ce que graphicPanel ne sera pas juste un JPanel mais un GraphicPanel

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public class GraphicPanl extends JPanel {
     
        protected void paintComponent (Graphics g) {
     
        }
     
    }
    Et dans ton interface :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    graphicPanel = new GraphicPanel();

  9. #9
    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 infiniment pour votre aide, enfin après 3 jours le problème d'affichage est résolu .
    Mais sa reste une seul chose : quand j'ai mis graphicPanel.repaint() dans mon Listener j'ai une résultat mais pas complète.
    => chaque image que j'ai mis auparavant est remplacé par la suivante.J'ai essayé de paramétrer repaint() pour redessiner que les parties que je veux mais hélas. Est ce qu'il y'a un autre route?
    voila mon code :
    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
    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
     
    protected class MyDocumentListener implements javax.swing.event.DocumentListener {
     
     
     
            @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 
     
                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)));
     
     
                      String line = Traffic.getText(Traffic.getLineStartOffset(lastreplace),Traffic.getLineEndOffset(lastreplace) -  Traffic.getLineStartOffset(lastreplace));
     
                       //repaint only with a valid line
                       if (line.indexOf(":") != (-1)) 
                       {
                          valuesId[0] = line.substring(0,line.indexOf(":"));
                          valuesId[1] = line.substring(line.indexOf(":")+1);
                          System.out.println(" i =  " + i);
                          graphicPanel.repaint();
                       } 
                       lastreplace +=1;
                  }
     
                    else//last line when it's not detected by the previous condition it'll be consumed here
                  {
                                //                     LAST       LINE
                  }
              }
                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
     
          }
     
        }

    et voila paintComponent() :
    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
    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
     
    public class GraphicWorld extends JPanel
        {
                 @Override
       public void paintComponent (Graphics g)
              {
     
     
                super.paintComponent(g);
                Graphics2D gfx = (Graphics2D)g;
           System.out.println(valuesId[0]);    
          if (!"0".equals(valuesId[0]))
          {
              System.out.println("pass"); 
           if(valuesId[0].contains("Port number"))
            {
     
             gfx.drawString("(Port)", 30, 10);
             gfx.drawString(valuesId[1],30, 140);
            }
           if(valuesId[0].contains("Port Extension"))
            {
                gfx.drawString("(EXT)", 100, 10);
                gfx.drawString(valuesId[1], 100, 140);
              //  draw(g);
            }
           if(valuesId[0].contains("Forward Extension"))
            {
     
              //  draw(g);
            }
           if(valuesId[0].contains("Port Activity"))
            {
              if(valuesId[1].contains("ON-HOOK"))
              {
               gfx.drawImage(bimgonhook, 95, 70, null);
              }
              if(valuesId[1].contains("OFF-HOOK"))
              {
               gfx.drawImage(bimgoffhook, 95, 70, null);
               }
            }
           if(valuesId[0].contains("Forward Staus"))
            {
                if(valuesId[1].contains("FORWARDED"))
                {
     
                    gfx.drawLine(95, 95, 110, 160);
                }
                else
                {
     
                    gfx.drawLine(140,80,140,110);
                Stroke drawingStroke = new BasicStroke(5, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL, 0, new float[] {4,2,9,2,1,2,5}, 0);
                   Line2D dashedline = new Line2D.Double(140, 140, 110, 110);
                   gfx.setStroke(drawingStroke);
                   gfx.draw(dashedline);
                }
            }
           if(valuesId[0].contains("Dialing"))
            {
                gfx.drawString("("+ valuesId[1]+" )", 100, 180);
                //draw(g);
            }
     
     
          }
        }
     
    }

+ 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, 17h20
  2. suppression avec sous requête conditionnelle
    Par melmel dans le forum Requêtes
    Réponses: 8
    Dernier message: 19/03/2004, 00h20
  3. [CODE] Compilation conditionnelle ?
    Par Cornell dans le forum Langage
    Réponses: 3
    Dernier message: 16/09/2003, 19h16
  4. [XSL] déclaration conditionnelle
    Par Totsira dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 18/08/2003, 06h02

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