# Java > Interfaces Graphiques en Java > AWT/Swing >  canvas ou jpanel

## azerty09

bonjour, ::D: 

1)Est ce qu'il y a une diffrence entre un Canvas et JPanel mis a part que l'une est de awt et l'autre de swing , ce que je veut dire c'est que pour dessiner  est ce qu'un jpanel est mieux qu'un canvas????

2)dans un canvas  pour crire du texte rcuprer  partir du clavier  je met


```

```

Comment faire la mme chose dans un JPanel

   merci d'avance ::D:

----------


## Orian

JPanel a pour but de remplacer le Canvas de awt (il n'y a pas de JCanvas d'ailleurs). 

Pour dessiner dans un JPanel tu dois surcharger la mthode paintComponent (au lieu de paint dans le cas du canvas).



```

```

Pour ce qui est du dessin dans une JPanel, c'est exactement comme dans un Canvas. Par contre si c'est pour simplement une String j'utiliserais un JLabel (mais c'est personnel peut tre ::roll:: )

----------


## azerty09

Bonsoir, 
 merci  ::D:  
pour dessiner c'est ok mais pour crire je ne voit toujours pas comment ??? ::roll::

----------


## Orian

Pour crire c'est de la mme manire qu'avec un Canvas, tu utilise la mthode drawString du graphics de ton composant...


```

```

----------


## dingoth

> JPanel a pour but de remplacer le Canvas de awt (il n'y a pas de JCanvas d'ailleurs).


 Ah bon ? Depuis quand ?

Le Canvas a toujours son utilit,  l'heure d'aujourd'hui. Et si on devait garder un seul lment de AWT, ce serait celui-l !

Le Canvas fait pour qu'on dessine dessus. Pourquoi ? Parce que c'est le seul lment vide. Il n'a que les vnements minimaux et ne contient rien du tout. C'est pour ne pas gaspiller la mmoire. Mais alors, quelle est la vraie utilit du Canvas ? Typiquement, c'est sur lui qu'on dessine un jeu en 2D. Ds qu'on souhaite faire du plein cran, on devrait se tourner vers lui. Ds qu'on cherche  dessiner toute une interface (sans rutiliser les lments de AWT/Swing, entendons-nous), il est prfrable d'utiliser un Canvas.

Un JPanel est, lui, rellement destin  recevoir d'autres lments graphiques de Java Swing. C'est ce qu'on appelle un conteneur, l o Canvas est un lment final, comme un bouton, un ascenseur, etc.

D'ailleurs, suffit de lire la doc :
JPanel :  JPanel is a generic lightweight container. 
Canvas :  A Canvas component represents a blank rectangular area of the screen onto which the application can draw or from which the application can trap input events from the user.

----------


## Orian

Tu a mal saisi ce que je voulait dire : JPanel remplace Canvas pour SWING, c'est pour a que je prcise qu'il n'y a pas de JCanvas... Je ne dis en rien que le Canvas est  mettre  la dcharge, il est utile, mais si on travaille en AWT.
En effet, il est prfrable je pense de ne pas mlanger AWT et SWING, donc Canvas si on travaille en AWT mais JPanel si on est en SWING.

----------


## dingoth

Sauf que le Canvas n'a PAS d'quivalent en Swing, ce n'est pas un oubli car le Canvas est le seul composant AWT recommand pour Swing. Hormis ce composant, il ne faut effectivement pas mlanger AWT et Swing.

Il faut toutefois l'utiliser  bon escient.

Le JPanel, lui n'est nullement destin  tre redessin. C'est un conteneur, c'est tout.

Edit : pourquoi le Canvas serait-il prsent sur cette page officielle du site de sun aux cts de composants swing et d'aucun autre AWT ?

----------


## bouye

Hormis des besoins tres specifiques pour dessiner en Swing, tu surcharges _JComponent_ ou _JPanel_, c'est suffisant pour 99% des cas et c'est comme ca, c'est tout. C'est la METHODE RECOMMANDEE pour dessiner en Swing.

Et avant que tu ne repondes davantage, n'importe quel _Component_ ou _JComponent_ a pour vocation a pouvoir etre un conteneur, c'est comme ca (meme une Canvas) c'est dans leur conception : ils heritent tous de _Container_...

Alors pourquoi c'est indique comme ca ?




> Pre-Made UI Components
> [...]
> Drawing areas (java.awt.Canvas) 
> [...]


Car avec une _Canvas_ on peut creer une _BufferStrategy_ qui est utile quand on veut directement dessiner dans la memoire de la carte video, ce qui est franchement utile dans 1% des cas. Et ca on ne peut pas le faire avec un _JComponent_ (la methode existe dans _Component_ mais est package protected, elle est uniquement publique dans _Canvas_). 
Mais, si tu sais correctement faire un rendu en Swing tu peux t'en passer.

Encore une fois, *GENERALEMENT*, melanger AWT et Swing c'est MAL. CEPENDANT, et *TRES RAREMENT*, il est parfois necessaire de le faire.

----------


## dingoth

Allez, je vais te laisser le dernier mot, a sert jamais  rien de discuter ici...

N'empche, merci de copier/coller 99% de mes paroles en tentant de me contredire au global  :;):

----------


## bouye

Pourtant...




> Le JPanel, lui n'est nullement destin  tre redessin. C'est un conteneur, c'est tout.


En gros : _JPanel_ = _JComponent_ opaque + bonnes options d'accessibilite.

----------


## dingoth

Ah, tu veux pas que je te laisse le dernier mot ?  ::P: 

Entirement d'accord avec toi.

Mais ce n'est pas parce qu'il a les capacits du JComponent (et donc celles de java.awt.Component et de java.awt.Container) que son *but* est d'tre redessin. Son *but* est d'tre un *conteneur*.

C'est aisment comprhensible que tous les composants Swing hritent de JComponent. C'est mme logique.

Mais Swing est un toolkit de *widgets* et mme s'il faut dessiner pour crer de nouveaux widgets, Swing n'a pas besoin qu'on redessine sur lui. Cela reste dlgu  java.awt.Canvas.

Si je reprends Wikipdia (anglophone, car les pages francophones sont on-ne-peut-plus-succintes) :
Swing : "Swing is a widget toolkit for Java."
AWT : "The Abstract Window Toolkit (AWT) is Java's original platform-independent windowing, graphics, and user-interface widget toolkit".

Je crois que l c'est clair :
AWT est l pour grer les fentres, les graphics/dessins et un toolkit de widgets. Swing n'est l que pour faire un toolkit de widgets (et amliorer les fentres).

----------


## Gfx

dingoth : Ayant travaill sur Swing chez Sun je vais me permettre de donner mon avis. On utilise il est vrai souvent le JPanel pour dessiner parce qu'il propose un fond opaque, mais en pratique on devrait partir du JComponent. Et on procde ainsi parce que la plupart du temps on cre un nouveau composant destin  s'intgrer dans une UI Swing. Alors certes, si tu fais un jeu tu peux te contenter du Canvas.

Nanmoins tu as tort lorsque tu dis cela :




> Mais Swing est un toolkit de widgets et mme s'il faut dessiner pour crer de nouveaux widgets, Swing n'a pas besoin qu'on redessine sur lui. Cela reste dlgu  java.awt.Canvas.


Swing ne dlgue absolument pas le rendu  Canvas. Swing et AWT utilisent tous les deux un Graphics comme contexte mais le Canvas est propre  AWT et le reste.

L'utilisation de JComponent au lieu de Canvas a d'autres avantages non ngligeables. Par exemple, les composants Swing utilisent du double-buffering par dfaut, ce qui vite de le faire soi-mme. Encore une fois,  moins de faire un jeu, c'est trs intressant.

AWT ne sert maintenant que de plomberie entre l'OS et Swing, fournissant comme tu le dis la fentre. Mais le dessin est gr par Java2D (donc Graphics2D) qui lui se contrefout du Canvas.

Bref, le Canvas n'est en rien recommand pour utilisation avec Swing puisqu'il provoque les fameux problmes de lightweight/heavyweight. Comme l'a dit bouye, dans 99% des cas tu n'as pas besoin du Canvas donc autant viter les emmerdes et partir de JComponent.

Et JComponent, mme s'il hrite de Container, est tout  fait destin  tre redessin. C'est bien pour a qu'il est non opaque et entirement transparent par dfaut.

----------


## dingoth

S'il te plat, ne me fais pas dire ce que je n'ai pas dit : Swing ne dlgue rien  Canvas, je le sais bien et je n'ai pas dit le contraire. Ma phrase, aprs relecture, peut prter  confusion mais ce n'est pas l ce que j'ai voulu dire. Ce que je voulais dire, c'est : "Mais Swing est un toolkit de *widgets* et, dans un cadre d'utilisation propre, utilisez Swing pour dessiner de nouveaux *composants* Swing, pas tout et n'importe quoi. On prfrera alors Canvas."

Comme tu le dis _et_ comme je l'ai dit, dessiner sur Swing est une approche essentiellement oriente composants. Voil enfin quelqu'un qui utilise un JPanel pour un conteneur et pas pour une table de dessin. Et tout ce que tu dis rejoint ma pense,  la seule diffrence que je dis : "Ola, ne dnigrez pas Canvas : s'il y a une seule chose  garder d'AWT (en tant que collection de widgets), c'est Canvas pour faire des dessins."

Quant  mon intervention initiale servait uniquement  dire que chaque objet a une utilisation normale et des utilisations possibles. Chaque composant Swing peut contenir d'autres composants, mais chacun a son utilit propre : on ne va pas demander une JTable pour afficher une seule icne dans le coin suprieur droit et utiliser le reste des cellules comme un layout ; on ne va pas demander une Combobox pour afficher une liste d'objets ; etc.

Alors oui, je n'ai peut-tre pas pens  dire qu'azerty09 ferait mieux d'tendre un JComponent, de le rendre opaque (parce que mme si je ne m'estime pas mauvais dveloppeur, je ne pense pas  tout non plus), mais j'ai au moins dit que le JPanel n'a pas pour but d'tre redessin de cette manire, et que comme composant de dessin, dans un cadre d'utilisation propre, le Canvas est plus appropri (mais tu as raison, le JComponent l'est davantage dans certains cas).

----------


## Gfx

> S'il te plat, ne me fais pas dire ce que je n'ai pas dit


Exprime-toi clairement alors.

Le Canvas est utile dans une application Swing dans des cas trs particuliers. Il n'apporte presque aucun avantage par rapport  JComponent et peut au contraire se rvler problmatique. Dans ce cas je ne considre pas une bonne ide de conseiller Canvas plutt que JComponent. Surtout quand JComponent aide en proposant le double-buffering.

Swing est dj suffisamment complexe comme a sans embrouiller inutilement les choses. JComponent est bien la meilleure manire de dessiner en Swing, point barre.

----------


## dingoth

> point barre.


videmment :]

----------

