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 :

[Image] Quadrillage JPanel


Sujet :

AWT/Swing Java

  1. #1
    Membre régulier
    Inscrit en
    Mai 2006
    Messages
    166
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 166
    Points : 91
    Points
    91
    Par défaut [Image] Quadrillage JPanel
    Salut à tous,
    J'ai un JPanel avec une image de fond et au-dessus un quadrillage.
    Le problème c'est que je redessine à chaque fois le quadrillage dans sa totalité. (deux boucle for ou j'utilise la méthode drawLine()). Je voudrais faire en sorte de créer une seule fois une image "quadrillage" lors de l'initialisation de mon composant que je réutiliserai par la suite en lieu et place de mes deux boucles for.

    Quelqu'un aurait-il une idée sur comment créer une "image quadrillage" à partir de la fonction drawLine() ?

    Merci d'avance
    --
    "Qui fait le malin tombe dans le ravin"

  2. #2
    Membre confirmé Avatar de NeptuS
    Profil pro
    Inscrit en
    Août 2005
    Messages
    392
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2005
    Messages : 392
    Points : 508
    Points
    508
    Par défaut
    tu "capture" une image de (image + quadrillage) et tu remplace le tout par la nouvelle image.

    pour la capture, je te renvoie aux FAQ de DVP
    [EDIT]Laisse tomber cette réponse, j'ai mal compris ton problème[/EDIT]
    Toute vérité est bonne à entendre, même si toutes les vérités ne sont pas bonnes à dire.
    Rien ne sert de partir à point, il vaut mieux courir .

  3. #3
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Tu peux dessiner ton quadrillage dans une image transparente et ensuite au choix :

    - dans paintComponent() dessiner cette image APRES avoir peint l'image de fond. Attention si ton composant est redimensionne, il te faudra probablement recalculer l'image de la grille (voir ComponentListener). Cette methode est plus pratique si ta grille contient des informations (coordonnees, etc...).

    - la mettre dans un TexturePaint et dans paintComponent() peindre un grand rectangle couvrant toute la zone de dessin avec cette texture APRES avoir peint l'image de fond. Cette methode peut etre interessante nottament si ta grille ne comporte pas d'indication speciale (ex : juste une grille de lignes). En plus cela te permet de creer une image de taille minimale (ex : juste une cellule de la grille) et d'economiser ainsi de la memoire.

    Ceci dit a moins que le dessin de ta grille ne soit gourmand en ressources et en temps, il n'y a rien de mal a le dessiner directement dans le paintComponent() avec tes boucles.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  4. #4
    Nouveau membre du Club Avatar de RadicalBob
    Profil pro
    Étudiant
    Inscrit en
    Juin 2006
    Messages
    66
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2006
    Messages : 66
    Points : 37
    Points
    37
    Par défaut
    Tiens bah je viens de faire ça ce soir pour un truc a moi :

    Ici :

    panelSize est la taille du JPanel.
    SYSTEM_NOMBRE_PLANETE est le nombre de cases sur une largeur (je dessine une grille carrée)
    SYSTEM_MAP_PLANETESIZE est la largeur d'une case.

    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 void paintComponent (Graphics g) {
    	//Dessin du background
    	this.drawBackground(g);
     
    	//Dessin du quadrillage
    	this.drawTable(g);
     
    }
    private void drawBackground(Graphics g){
     
    	int nbh = ((int)this.panelSize.getHeight()/ifond.getHeight(null))+1;//Calcul du nombre d'images de fond pour la hauteur
    	int nbl = ((int)this.panelSize.getWidth()/ifond.getWidth(null))+1;//Meme calcul pour la largeur
    	for (int i = 0; i<nbh; i++) {//Dessin dans la hauteur			
    		for (int j = 0; j<nbl; j++) {//Dessin dans la largeur				
    			//Dessin de l'image de fond
    			g.drawImage(ifond, ifond.getWidth(null)*j, i*ifond.getHeight(null), null);				
    		}			
    	}		
    }
    private void drawTable(Graphics g){
     
    	g.setColor(Color.GREEN);
    	for(int i = 1; i<GConstantes.SYSTEM_NOMBRE_PLANETE;i++){
    		g.drawLine(i*GConstantes.SYSTEM_MAP_PLANETESIZE, 0, i*GConstantes.SYSTEM_MAP_PLANETESIZE,GConstantes.SYSTEM_NOMBRE_PLANETE*GConstantes.SYSTEM_MAP_PLANETESIZE);			
    		g.drawLine(0, i*GConstantes.SYSTEM_MAP_PLANETESIZE, GConstantes.SYSTEM_NOMBRE_PLANETE*GConstantes.SYSTEM_MAP_PLANETESIZE,i*GConstantes.SYSTEM_MAP_PLANETESIZE);
    	}
    }
    Remarques :
    -Tu veras qu'une seule boucle suffit pour dessiner le quadrillage.
    -Comme tu peux l'observer je calcule le nombre d'image a afficher en hauteur et largeur de facon a pouvoir afficher une petite image en mosaique, pratique pour les grandes fenetres.

    Ca me donne ca :

    Horloge : machine de grande morale pour l’Homme, lui rappelant sans cesse qu’il lui reste un peu de temps à vivre.

  5. #5
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Vi, c'est tres facile de faire une seule boucle... quand on a le meme nombre de lignes et de colonnes dans sa grille......
    Ca ne regle en rien le probleme souleve

    A oui tiens j'oubliais une autre maniere de rendre ta grille re-utilisable est de deplacer son dessin dans une methode externe plus generaliste genre :

    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
    public class DrawingUtilities {
    
      /** Draw a grid, this method will use the current paint and stroke of the drawing context.
       * @param graphics The graphics context.
       * @param width The width of the drawing area.
       * @param height The height of the drawing area.
       * @param sizeX Width of a grid cell.
       * @param sizeY Height of a grid cell.
       * @param offsetX Offset for the first stroke on the X axis (usually 0) ; 0 &lt;= <code>offsetX</code>  &lt; <code>sizeX</code>.
       * @param offsetY Offset for the first stroke on the Y axis (usually 0) ; 0 &lt;= <code>offsetX</code>  &lt; <code>sizeY</code>.
      */
      public static void drawGrid(Graphics2D graphics, int width, int height, sizeX, sizeY, int offsetX, int offsetY) {
        ...
      }
    }
    Apres a toi de voir si tu veux l'appeler sur une image ou directement depuis le paintComponent().
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  6. #6
    Membre régulier
    Inscrit en
    Mai 2006
    Messages
    166
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 166
    Points : 91
    Points
    91
    Par défaut
    Merci pour toutes vos réponses.
    Je veux appeler ma méthode depuis paintComponent(). En fait je fais un éditeur de map et les lignes me permettent de rendre plus évident les démarcations entre les tiles. normalement j'ai fixé la taille de mon JPanel avec setPreferredSize() donc normalement je ne dois pas avoir à redimensionner l'image du quadrillage. (eut-être je me trompe ?).
    Je vais essayer de dessiner sur une image transparente.

    ps:je suis obligé de faire deux boucles car si je veux changer la taille de mon panel (j'ai une macro MAP_WIDTH et une autre MAP_HEIGHT) pour plus tard peut-être changé la disposition des composants dans ma frame.
    --
    "Qui fait le malin tombe dans le ravin"

  7. #7
    Membre confirmé Avatar de NeptuS
    Profil pro
    Inscrit en
    Août 2005
    Messages
    392
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2005
    Messages : 392
    Points : 508
    Points
    508
    Par défaut
    il me semble que tu peux dessiner en dehors des limites de l'image (en positif), donc a priori 1 seule boucle est possible même si le nombre de lignes et de colonnes est différent : il suffit de prendre le plus grand des deux.
    Toute vérité est bonne à entendre, même si toutes les vérités ne sont pas bonnes à dire.
    Rien ne sert de partir à point, il vaut mieux courir .

  8. #8
    Nouveau membre du Club Avatar de RadicalBob
    Profil pro
    Étudiant
    Inscrit en
    Juin 2006
    Messages
    66
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2006
    Messages : 66
    Points : 37
    Points
    37
    Par défaut
    il me semble que tu peux dessiner en dehors des limites de l'image (en positif), donc a priori 1 seule boucle est possible même si le nombre de lignes et de colonnes est différent : il suffit de prendre le plus grand des deux.
    Aujourd'hui 09h34
    Tout a fait, c'est pour ça qu'une boucle peut suffire
    Horloge : machine de grande morale pour l’Homme, lui rappelant sans cesse qu’il lui reste un peu de temps à vivre.

  9. #9
    Membre confirmé Avatar de NeptuS
    Profil pro
    Inscrit en
    Août 2005
    Messages
    392
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2005
    Messages : 392
    Points : 508
    Points
    508
    Par défaut
    Citation Envoyé par bouye
    Vi, c'est tres facile de faire une seule boucle... quand on a le meme nombre de lignes et de colonnes dans sa grille......
    Ca ne regle en rien le probleme souleve
    C'est pour ça que j'ai dit qu'il était quand même possible de faire une seule boucle ....
    Toute vérité est bonne à entendre, même si toutes les vérités ne sont pas bonnes à dire.
    Rien ne sert de partir à point, il vaut mieux courir .

  10. #10
    Membre régulier
    Inscrit en
    Mai 2006
    Messages
    166
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 166
    Points : 91
    Points
    91
    Par défaut
    Bon, finalement j'ai opté pour une simple boucle. C'est simple et efficace et j'ai vue aucune différence avec le TexturePaint. Merci pour vos conseils.
    Ciao tutti.

    Nom : screenshot_editor.PNG
Affichages : 889
Taille : 93,7 Ko
    --
    "Qui fait le malin tombe dans le ravin"

  11. #11
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Arf visiblement on ne calcule pas la complexite et l'occupation CPU de la meme maniere ; en suposant qu'on dessine des cellules carrees dans une surface rectangulaire quelconque et qu'on a i ligne et j colonnes a dessiner :

    - 1 seule boucle : nombre appels a drawLine() = 2*n (avec n = Math.max(i, j)) tout le temps.

    - 2 boucles : nombre appels a drawLine() = i+j avec dans le pire des cas i == j (on dessine dans une surface carree) = 2*i.

    Pis franchement en general j'evite de devoir faire des trucs de ce genre :



    Rajouter des tests pour eviter le dessin en dehors de la zone fait perdre du temps pour rien.

    Alors une nouvelle fois
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  12. #12
    Membre régulier
    Inscrit en
    Mai 2006
    Messages
    166
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 166
    Points : 91
    Points
    91
    Par défaut
    pas faux. c'est ce que je m'étais dit au départ en postant... (je ferais bien de m'en retourner à mes bases d'algo moi ...)
    --
    "Qui fait le malin tombe dans le ravin"

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

Discussions similaires

  1. Image dans JPanel
    Par amel666 dans le forum Graphisme
    Réponses: 1
    Dernier message: 12/09/2007, 16h53
  2. Inserer Image Plusieurs JPanel
    Par keub51 dans le forum AWT/Swing
    Réponses: 12
    Dernier message: 28/03/2007, 01h07
  3. Problème avec image dans JPanel
    Par littleshrimp dans le forum AWT/Swing
    Réponses: 7
    Dernier message: 14/05/2006, 14h05
  4. Problème avec l'insertion d'une image dans JPanel
    Par anutka dans le forum AWT/Swing
    Réponses: 1
    Dernier message: 16/03/2006, 10h02
  5. [Swing] images et jPanel
    Par nma dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 08/10/2004, 23h20

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