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 :

Modification d'un JPanel pixel par pixel


Sujet :

AWT/Swing Java

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2006
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 34
    Par défaut Modification d'un JPanel pixel par pixel
    Bonjour,

    Je voudrais pouvoir afficher une fenêtre de 400 par 400 blanche au départ où je pourrais ensuite modifier la couleur de chaque pixel afin de tracer un nuage de point (dont j'ai les coordonnées dans un tableau).

    Je pensais faire un jpanel mais aprés je ne trouve pas la méthode qui me permettrait de modifier chaque pixel du jpanel.

    Merci d'avance pour votre aide.

    A++

  2. #2
    Membre chevronné Avatar de xixi31
    Inscrit en
    Juin 2005
    Messages
    423
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Juin 2005
    Messages : 423
    Par défaut
    je te conseille de jeter d'abord un coup d'oeil la dessus :
    http://duj.developpez.com/tutoriels/java/dessin/intro/

  3. #3
    Membre expérimenté

    Étudiant
    Inscrit en
    Mai 2006
    Messages
    200
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2006
    Messages : 200
    Par défaut
    Au niveau de la classe JComponent tu as cette méthode :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public void paint(Graphics g)
    qui est appelée pour dessiner n'importe quel composant qui hérite de JComponent (c'est le cas de JPanel).
    g est le contexte graphique du composant.
    A partir du contexte graphique, tu peux dessiner. Voir la classe Graphics.

    Par contre, dans la classe Graphics, il me semble qu'il n'y a pas de méthode pour dessiner uniquement un pixel.
    Cependant, en dessinant une ligne ou rectangle qui n'a ni largeur ni hauteur, il me semble que ca marche.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Février 2006
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 34
    Par défaut
    Merci beaucoup pour vos réponses. Je me suis mis au java récemment donc j'ai un peu du mal pour tout ce qui touche à l'interface graphique et au dessin.

    Bon dans tous les cas je vais essayer de me dépatouiller avec ça.

    A++

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Février 2006
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 34
    Par défaut
    J'ai lu les docs que vous m'avez conseillé et en effet ça m'a aidé à comprende pas mal de trucs par contre j'ai encore deux petites question :

    Pour dessiner mon composant la méthode paint(graphics g) est appelée mais le problème c'est que j'aimerais bien ajouter un argument à paint (ce qui apparemment n'est pas possible) pour pouvoir passer en argument un tableau à deux dimensions contenant les coordonnées en x et y des points à tracer.

    Pour être clair je souhaiterais faire un truc comme ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public void paint(Graphics g, double tableau[][]) {
    		int x,y ;
    		Base A = new Base(0,0);
    	    Trans B = new Trans();
    	    CoordCarte C = new CoordCarte();
    		for(int i=0; i<360; i++) {
    			x = (int) Math.floor(tableau[i][1]);
    			y = (int) Math.floor(tableau[i][1]);
    			g.drawLine(x,y,x,y);
    		}
    Mais bon vu que je crois que ce n'est pas possible quelle serait l'autre méthode à adopter ???

    Merci

  6. #6
    Membre émérite Avatar de remika
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    806
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 806
    Par défaut
    Pout faire un nuage de points j'utiliserais une api de graphes genre JFreeChart, ça me parait plus simple...

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Février 2006
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 34
    Par défaut
    JFreechart a l'air pas mal mais bon c'est un petit peu usine à gaz.
    En fait le but de mon programme est de tracer une aile d'avion puis les lignes de courant autour (à l'aide de la transformée de joucowsky) ainsi que la vitesse du flux d'air donc j'aurasi à superposer 3 figures (ou modifier une image déja crée).

    A++

  8. #8
    Membre émérite Avatar de remika
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    806
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 806
    Par défaut
    J'avais fait un truc du style en superposant des pies de JFreeChart sur une planisphère modifiée en java. Mais dans ton cas c'est vrai que JFreeChart c'est peut-être trop

    En tous cas ça a l'air bien intéressant.

  9. #9
    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
    En fait ton problème viens de la modélisation objet que tu as utilisé.

    La méthode paint, enfin mieux vaut lui préférer la méthode paintComponent en Swing, existe déja pour n'importe quel composant. Donc tu ne peux la redéfinir qu'en gardant la même signature.

    Dans ton cas il faut que ton tableau de double soit contenu dans ta classe héritant de JPanel

    Dans ce style là:
    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
    
    public class MonTableau extends JPanel {
       private double[][] tab;
    
    
       public void setTabValueAt(double value, int x, int y) {
           tab[x][y] = value;
           repaint();
       }
    
       public void setTab(double[][] tab) {
           this.tab = tab;
           repaint();
       }
    
       protected void paintComponent(Graphics g) {
           int x,y ;
           Base A = new Base(0,0);
           Trans B = new Trans();
           CoordCarte C = new CoordCarte();
           for(int i=0; i<360; i++) {
               x = (int) Math.floor(tab[i][1]);
               y = (int) Math.floor(tab[i][1]);
               g.drawLine(x,y,x,y);
           }   
        }
    }

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Février 2006
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 34
    Par défaut
    Merci beaucoup de vos réponses je commence à comprendre la démarche .Et puis merci pour le morceau de code ça m'aide beaucoup.

    A++

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Février 2006
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 34
    Par défaut
    Bonjour j'ai de nouveau un petit problème.
    J'ai crée une interface graphique avec matisse et j'ai essayé d'insérer mon dessin dans un JPanel lorsque l'on appuie sur un bouton .

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton1ActionPerformed
    	geo.Base cylindre = new geo.Base(2,2);
    	geo.CoordCarte coord = new geo.CoordCarte();
    	JCanvas Jpan = new JCanvas();
    	Jpan.setSize(400,400);
    	Jpan.setBackground(new java.awt.Color(255, 255, 255));
    	Jpan.setTab(coord.conversion_carte_aile(cylindre.cylindre_complex()));
    	jPanel2.add(Jpan);
    	}//GEN-LAST:event_jButton1ActionPerformed

    Seulement lorsque j'appuie sur le bouton rien ne se passe.

    Merci de votre aide

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    47
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 47
    Par défaut
    En fait, pour que ton bouton fonctionne, il faut que ta classe implemente la methode ActionPerformed de la classe ActionListener qui permettra a ton bouton de realiser sa tache lorsque tu cliquera dessus...

    Ta methode privée n'est pas bonne. elle n'agit en rien sur le bouton. Il faut que tu remplaces ta methode privée par celle ci ( je ne connais pas le nom de ton bouton, donc verifie bien la methode ci dessous)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public void actionPerformed ( ActionEvent e )
        {
            if ( "jButton1".equals ( e.getActionCommand() ) ){
     
              geo.Base cylindre = new geo.Base(2,2);
    	  geo.CoordCarte coord = new geo.CoordCarte();
    	  JCanvas Jpan = new JCanvas();
    	  Jpan.setSize(400,400);
    	  Jpan.setBackground(new java.awt.Color(255, 255,255));
             Jpan.setTab(coord.conversion_carte_aile(cylindre.cylindre_complex()));
    	  jPanel2.add(Jpan);
           }    
        }
    et il faut que tu rajoutes un ecouteur d'action sur ton bouton juste apres sa création:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    jButton1.addActionListener ( this );

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Février 2006
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 34
    Par défaut
    Salut ,

    en fait j'ai rajouté un petit this.repaint() à la fin et ça a l'air de marcher.Bon par contre est-ce que c'est la meilleure méthode je n'en suis pas sur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton1ActionPerformed
    	geo.Base cylindre = new geo.Base(2,2);
    	geo.CoordCarte coord = new geo.CoordCarte();
    	JCanvas Jpan = new JCanvas();
    	Jpan.setSize(400,400);
    	Jpan.setBackground(new java.awt.Color(255, 255, 255));
    	Jpan.repaint();
    	Jpan.setTab(coord.conversion_carte_aile(cylindre.cylindre_complex()));
    	jPanel2.add(Jpan);
    	this.repaint();
    	}//GEN-LAST:event_jButton1ActionPerformed

Discussions similaires

  1. Réponses: 11
    Dernier message: 08/08/2006, 23h11
  2. Lecture de fichiers images pixels par pixels
    Par FabHacker dans le forum Langage
    Réponses: 3
    Dernier message: 26/11/2005, 16h12
  3. [ImageMagick] Parcourir une image pixel par pixel
    Par kip dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 05/10/2005, 14h10
  4. [VB6] [Graphisme] Transfert d'image pixel par pixel
    Par SpaceFrog dans le forum VB 6 et antérieur
    Réponses: 16
    Dernier message: 15/10/2002, 09h53

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