# Java > Interfaces Graphiques en Java > AWT/Swing >  [Image] Quadrillage JPanel

## krokmitaine

Salut  tous,
J'ai un JPanel avec une image de fond et au-dessus un quadrillage.
Le problme c'est que je redessine  chaque fois le quadrillage dans sa totalit. (deux boucle for ou j'utilise la mthode drawLine()). Je voudrais faire en sorte de crer une seule fois une image "quadrillage" lors de l'initialisation de mon composant que je rutiliserai par la suite en lieu et place de mes deux boucles for. 

Quelqu'un aurait-il une ide sur comment crer une "image quadrillage"  partir de la fonction drawLine() ?

Merci d'avance

----------


## NeptuS

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 rponse, j'ai mal compris ton problme[/EDIT]

----------


## bouye

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.

----------


## RadicalBob

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 carre)
SYSTEM_MAP_PLANETESIZE est la largeur d'une case.



```

```

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 :

----------


## bouye

::lol::  Vi, c'est tres facile de faire une seule boucle... quand on a le meme nombre de lignes et de colonnes dans sa grille......  ::roll::  
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 :



```

```

Apres a toi de voir si tu veux l'appeler sur une image ou directement depuis le _paintComponent()_.

----------


## krokmitaine

Merci pour toutes vos rponses.
Je veux appeler ma mthode depuis paintComponent(). En fait je fais un diteur de map et les lignes me permettent de rendre plus vident les dmarcations 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.

----------


## NeptuS

il me semble que tu peux dessiner en dehors des limites de l'image (en positif), donc a priori 1 seule boucle est possible mme si le nombre de lignes et de colonnes est diffrent : il suffit de prendre le plus grand des deux.

----------


## RadicalBob

> il me semble que tu peux dessiner en dehors des limites de l'image (en positif), donc a priori 1 seule boucle est possible mme si le nombre de lignes et de colonnes est diffrent : il suffit de prendre le plus grand des deux.
> Aujourd'hui 09h34


Tout a fait, c'est pour a qu'une boucle peut suffire  :;):

----------


## NeptuS

> 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 mme possible de faire une seule boucle ....

----------


## krokmitaine

Bon, finalement j'ai opt pour une simple boucle. C'est simple et efficace et j'ai vue aucune diffrence avec le TexturePaint. Merci pour vos conseils.  
Ciao tutti.

----------


## bouye

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  ::roll::

----------


## krokmitaine

pas faux. c'est ce que je m'tais dit au dpart en postant... (je ferais bien de m'en retourner  mes bases d'algo moi ...)

----------

