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 :

Dessin sur un Jpanel et mise-a-jour de dessin sur un Jpanel


Sujet :

AWT/Swing Java

  1. #1
    Membre du Club

    Inscrit en
    Mai 2003
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 26
    Points : 68
    Points
    68
    Par défaut Dessin sur un Jpanel et mise-a-jour de dessin sur un Jpanel
    Salut,
    C'est pour demander quelques explications et aides sur 2 problemes que je n'arrive pas à bien cerner.

    Pb1Explication) Voici un petit bout de code pour mettre en blanc le fond de mon Jpanel. Je constate que le paintComponent, est appelé deux fois(affiche 2 fois DEBUT2), alors que je dessine le composant juste une seule fois. Pourquoi et si possible comment l'éviter ?

    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
     
    import java.awt.Color;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.SystemColor;
    import java.awt.BorderLayout;
    import java.awt.geom.Line2D;
     
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
     
    public class sampleFrame {
     
    	public static void main(String[] args)
        {		
     
     
    		samplePanel plot = new samplePanel();
     
     
    		JFrame f = new JFrame();
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
     
            f.getContentPane().add(plot); //.add(plot);
            f.setSize(100,65);
            f.setLocation(50,50);
            f.setVisible(true);
        }
    }
     
    class samplePanel extends JPanel
    {
    	protected void paintComponent(Graphics g)
        {
    		Graphics2D g2 = (Graphics2D)g;
    		super.paintComponent(g);
    		setBackground(Color.WHITE); //Couleur de fond du composant
     
            System.out.println("DEBUT2");  
        }
    }
    Pb2Explication)
    Au fait dans la classe: samplePanel je fait des dessins de coubes de fonctions. Mais lorqu'on entre les parametres de la deuxième fonction, le dessin ce fait sur la courbe de la premième fonction dessinée. Meme si les paramettres de deux foncions sont différentes. Pourquoi et si possible comment l'éviter ?

    Merci pour tous aides.

  2. #2
    Membre averti Avatar de let_me_in
    Inscrit en
    Mai 2005
    Messages
    441
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 441
    Points : 437
    Points
    437
    Par défaut
    pour ton premier probleme, paintComponent est appelee a chaque modification de l'etat du panel ou de son container(agandissement, scroll..)
    il suffit d'effacer l'ancienne courbe:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g.clearRect(int x, int y, int width, int height);
    qui dit Dieu n'existe pas dis que les programmes tournent sans processeur.

  3. #3
    Membre du Club

    Inscrit en
    Mai 2003
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 26
    Points : 68
    Points
    68
    Par défaut
    Merci pour les explications du premier probleme. Pour le second,

    j'explique encore mieux le probleme avec un petit bout de code. En cliquant sur le bouton "Draw", il est supposé dessiner des traits reliés entre eux au centre en différentes couleurs. Mais à partir du troisième trait ca ne marche plus bien.



    import java.awt.Color;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.BorderLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.geom.GeneralPath;
    import java.util.Vector;

    import javax.swing.JButton;
    import javax.swing.JFrame;

    import javax.swing.JPanel;


    public class sampleFrame extends JFrame implements ActionListener{

    private JButton drawButton=new JButton("Draw");
    private samplePanel plot;
    private int nbCurve=0;

    public static void main(String[] args)
    {
    sampleFrame f = new sampleFrame();
    f.createGUI();
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.pack();
    f.setSize(300,200);
    f.setLocation(50,50);
    f.setVisible(true);
    }

    public void createGUI()//Pour initialise l'interface graphique
    {
    drawButton.addActionListener(this);
    drawButton.setActionCommand("drawButton");

    this.setLayout(new BorderLayout());
    plot = new samplePanel();
    this.getContentPane().add(plot,BorderLayout.CENTER);
    this.getContentPane().add(drawButton,BorderLayout.SOUTH);
    }

    public void actionPerformed(ActionEvent e)
    {
    if ("drawButton".equals(e.getActionCommand())) {

    nbCurve++;
    //plot.generalPaths.removeAllElements();
    plot.drawCurves(nbCurve);
    plot.repaint();
    System.out.println("nbCurve="+nbCurve);
    }
    }

    }

    class samplePanel extends JPanel
    {
    public Vector generalPaths = new Vector(); //Vecteur qui va contenir les courbes
    GeneralPath path; //Represente chaque courbes
    private int nbCurve=0;

    protected void paintComponent(Graphics g) //Pour dessiner le fond du composant et les courbes
    {

    g.clearRect(0,0,300,200);
    Graphics2D g2 = (Graphics2D)g;
    super.paintComponent(g);
    setBackground(Color.WHITE); //Couleur de fond du composant
    System.out.println("paintComponent");

    if(!generalPaths.isEmpty())
    {
    for(int i=0; i<nbCurve; i++)
    {
    if(i==0) g2.setPaint(Color.RED);
    else if(i==1) g2.setPaint(Color.BLUE);
    else if(i==2) g2.setPaint(Color.BLACK);
    else if(i==3) g2.setPaint(Color.GREEN);
    else if(i==4) g2.setPaint(Color.MAGENTA);
    else if(i==5) g2.setPaint(Color.YELLOW);

    System.out.println("Current curve number="+i);

    g2.draw((GeneralPath) generalPaths.elementAt(i));
    }

    }
    }

    public void drawCurves(int nbCurve) //Pour dessiner les courbes
    {
    this.nbCurve=nbCurve;

    for(int i=0; i<nbCurve; i++)
    {
    path = new GeneralPath();
    path.moveTo(50+10*nbCurve,nbCurve+20);
    path.lineTo(100+nbCurve,nbCurve+100);

    generalPaths.addElement(path);
    }
    }
    }
    D'ou vient le problème et comment faire pour le régler ?

    Merci pour tout.

  4. #4
    Membre averti Avatar de let_me_in
    Inscrit en
    Mai 2005
    Messages
    441
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 441
    Points : 437
    Points
    437
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    for(int i=0; i<nbCurve; i++)
    {
    if(i==0) g2.setPaint(Color.RED);
    else if(i==1) g2.setPaint(Color.BLUE);
    else if(i==2) g2.setPaint(Color.BLACK);
    else if(i==3) g2.setPaint(Color.GREEN);
    else if(i==4) g2.setPaint(Color.MAGENTA);
    else if(i==5) g2.setPaint(Color.YELLOW);
     
    System.out.println("Current curve number="+i);
     
    g2.draw((GeneralPath) generalPaths.elementAt(i));
    }
    le probleme vient de la,
    quand nbCurve depasse 5, il la couleur de dessin reste toujours YELLOW, et les ligne donnent l'impression qu'ils ne se dessinent pas (or c'est pas le cas, tu n'arive seulementpa a les voir parcequ'ils sont de meme couleur).
    remplace cette portion de code par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    for(int i=0; i<nbCurve; i++)
    {
    if(i==0) g2.setPaint(Color.RED);
    else if(nbCurve%i==1) g2.setPaint(Color.BLUE);
    else if(nbCurve%i==2) g2.setPaint(Color.BLACK);
    else if(nbCurve%i==3) g2.setPaint(Color.GREEN);
    else if(nbCurve%i==4) g2.setPaint(Color.MAGENTA);
    else if(nbCurve%i==5) g2.setPaint(Color.YELLOW);
     
    System.out.println("Current curve number="+i);
     
    g2.draw((GeneralPath) generalPaths.elementAt(i));
    }
    et ce devrait marcher.

    PS: jette un coup d'oeil sur la convention des noms des classes.
    qui dit Dieu n'existe pas dis que les programmes tournent sans processeur.

  5. #5
    Membre du Club

    Inscrit en
    Mai 2003
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 26
    Points : 68
    Points
    68
    Par défaut
    Salut,
    , le probleme est réglé. C'est à cause du

    for(int i=0; i<nbCurve; i++)

    de la fonction drawCurves. A chaque clic plusieur nbCurve élément sont rentrée dans le vecteur. Donc il suffit d'enlever le for.

    Merci.

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

Discussions similaires

  1. mise a jour de table sur une autre base de donnée
    Par didinedz dans le forum Réplications
    Réponses: 2
    Dernier message: 07/06/2012, 17h06
  2. Mise a jour de logiciel sur Microsoft
    Par must19 dans le forum Débuter
    Réponses: 0
    Dernier message: 01/03/2009, 14h59
  3. Mise a jour par action sur un bouton
    Par Dieu091 dans le forum IHM
    Réponses: 3
    Dernier message: 14/06/2007, 11h39
  4. Mise a jour de l'affichage JFrame-JPanel
    Par aristeas dans le forum Agents de placement/Fenêtres
    Réponses: 5
    Dernier message: 10/06/2006, 10h12
  5. [Plugin][Eclipse3] mise a jour de header sur fichier .java
    Par spegase dans le forum Eclipse Java
    Réponses: 4
    Dernier message: 05/05/2005, 20h06

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