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 :

JComponent ou JPanel et paint()


Sujet :

AWT/Swing Java

  1. #1
    Expert confirmé
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Par défaut JComponent ou JPanel et paint()
    Coucou me revoilou.

    Je souhaite savoir sir les composants de type JComponent ou JPanel disposent d'un système d'affichage propre, donc si on peut obtenir une pointeur sur un objet graphics et donc dessiner dessus ?

    d'avance merci.

  2. #2
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,


    Tu peux très bien redéfinir la méthode paintComponent() pour déssiner dessus comme bon te semble...

    Cette méthode est appellé automatiquement lorsque il y a besoin de redessiner le composant. Elle doit donc redéssiner le composant dans sa totalité.


    a++

  3. #3
    Expert confirmé
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Par défaut
    Ok merci, mais en admettant que je désire seulement dessiner un rectangle ou une ligne sur cette surface ?

  4. #4
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par SheikYerbouti
    Ok merci, mais en admettant que je désire seulement dessiner un rectangle ou une ligne sur cette surface ?
    Et bien il suffit d'utiliser l'objet Graphics en paramètre pour y dessiner ce que tu souhaites.

    Et si ton composant est rendu à l'écran (et pas imprimé), tu peux utiliser caster cet objet en Graphics2D qui offre plus de possibilitées...

    a++

  5. #5
    Expert confirmé
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Par défaut
    Ok, tu confirme que je peut utiliser le résultat de getGraphics() directemetn sur ces 2 objets alors ?

  6. #6
    Membre éprouvé Avatar de BlackWood
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    167
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 167
    Par défaut
    Dans ta redéfinition du paintComponent(Graphics g), il faudra de toute façon appeler la super méthode super.paintComponent(g). Elle redessinera ton composant normalement.
    Il suffit ensuite d'ajouter ce que tu veux !

    edit : Whoua ! Bien à la bourre, moi... M'enfin...

  7. #7
    Expert confirmé
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Par défaut
    Ok ! splendide !

  8. #8
    Gfx
    Gfx est déconnecté
    Expert confirmé
    Avatar de Gfx
    Inscrit en
    Mai 2005
    Messages
    1 770
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Par défaut
    N'appelle pas getGraphics(), il faut surcharger paintComponent() sinon ton dessin ne restera pas à l'écran.

  9. #9
    Expert confirmé
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Par défaut
    Citation Envoyé par Gfx
    N'appelle pas getGraphics(), il faut surcharger paintComponent() sinon ton dessin ne restera pas à l'écran.
    En fait je l'appelle pour initialiser un objet Graphics2D, histoire de pouvoir utiliser la fonction setStroke(). et le dessin perdure bien.
    Cependant, il est dessiné sur le fond du panel, avant que les autres composants ne soient dessinés.
    Existe t-il un moyen de dessiner par dessus les autres composants et ce, de façon durable ?

  10. #10
    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
    Le glasspane, mais par contre il faut vraiment redéfinir la méthode paintComponent et ne pas appeler getGraphics (les graphics te sont fournis en paramètres de cette méthode)

    Pour le glasspane il te faudra créer un panel transparent (et pas simplement opaque) sur lequel tu dessinera par la suite et que tu affecteras avec un setGlassPane sur ta JFrame.

    SInon tu peux également passer par un JLayeredPane

  11. #11
    Expert confirmé
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Par défaut
    Ok merci.
    Ces objets sont-ils disponible avec la version 1.3 du JRE ?

  12. #12
    Gfx
    Gfx est déconnecté
    Expert confirmé
    Avatar de Gfx
    Inscrit en
    Mai 2005
    Messages
    1 770
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Par défaut
    Pour créer un glass pane transparent il suffit d'hériter de JComponent et pas de JPanel (JPanel est un simple JComponent opaque, rien de plus).

  13. #13
    Expert confirmé
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Par défaut
    Citation Envoyé par Gfx
    Pour créer un glass pane transparent il suffit d'hériter de JComponent et pas de JPanel (JPanel est un simple JComponent opaque, rien de plus).
    J'hérite effectivement de JComponent. ça devrait le faire, alors

  14. #14
    Expert confirmé
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Par défaut
    Vous êtes sûr que ces fonctionalités sont dispo en 1.3 ?

  15. #15
    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

  16. #16
    Expert confirmé
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Par défaut
    Alors là, je voudrais dire que : Excellent

  17. #17
    Membre expérimenté
    Avatar de Ecosmose
    Homme Profil pro
    Archi SI / Soft / Réseau / SCADA /Automate
    Inscrit en
    Janvier 2007
    Messages
    170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Archi SI / Soft / Réseau / SCADA /Automate
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 170
    Par défaut
    Le procédé marche -t il avec la classe canvas ?

    J'utilise ce cnavas pour dessiner une image puis l'insérer dans un JPanel, mon souci est que l'image s'affiche une fois au démarrage (tel un flash) puis disparait..

    Or la classe canvas n'est pas un JComponent et ne possède donc pas de fonction paintCOmponent() j'ai alors redéfinit paint(graphics g) avec la méthode du double buffering software mais rien n'y fait

    Avez vous une idée ?
    Fichiers attachés Fichiers attachés

  18. #18
    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
    Non canvas est issu d'AWT, pas de swing, et AWT ne possède pas de mécanisme de GlassPane.

    Enfin le plus simple est que tu remplaces ton Canvas par un JCOmponent ou un JPanel et que tu redéfinisse la méthode paintComponent.

    D'autant plus que ton code mélange AWT et Swing ce qui est considéré comme un bad practice.

    Et tout ce que tu peux faire sur un Canvas tu peux le faire sur un JPanel à deux trois exceptions près

  19. #19
    Membre expérimenté
    Avatar de Ecosmose
    Homme Profil pro
    Archi SI / Soft / Réseau / SCADA /Automate
    Inscrit en
    Janvier 2007
    Messages
    170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Archi SI / Soft / Réseau / SCADA /Automate
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 170
    Par défaut
    Ok !

    Je te remercie de ta clarté ...je pensais que les classes Swing étaient héritées de AWT.

    A l'avenir je suivrais tes conseils dans la programmation de GUI
    Je vous tiens au courant sur ce code

  20. #20
    Membre expérimenté
    Avatar de Ecosmose
    Homme Profil pro
    Archi SI / Soft / Réseau / SCADA /Automate
    Inscrit en
    Janvier 2007
    Messages
    170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Archi SI / Soft / Réseau / SCADA /Automate
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 170
    Par défaut
    dans mon source on voit dans la fonction paintComponent que j'utilise la fonction createImage du JPanel Diagramm...ici Diagram est inclue dans la moitié dans la fenetre principale..

    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
     
     protected void paintComponent(Graphics g){
     
    		//création du buffer si il n'existe pas
    	     if(buffer==null){
    	    	 Imagetemp = Diagramm.createImage(Diagramm.getWidth(),             Diagramm.getHeight());
    	    	 buffer = Imagetemp.getGraphics();
     
    	      }
    	     //on dessine sur le buffer mémoire
    	     //ici le dessin n'est pas traité pour la clarté de la question
     
    	      // finalement, le buffer mémoire est dessiné dans le buffer d'affichage
    	     g.drawImage(Imagetemp,Diagramm.getX(),Diagramm.getY(),Diagramm.getWidth(), Diagramm.getHeight(),this); 
    	     buffer.dispose();
    Mon nouveau problème est que l'image qui s'affiche (pas tout le temps d'ailleurs) récupère toute la fenetre..je suppose que le context graphique g qui est passé recupère donc toute la fenete (en taille)
    mais dans ce cas pourquoi utiliser la fonction paint COmponent (rapport avec Heavy, Lightweight ?)

Discussions similaires

  1. [JPanel] paint, paintComponent et repaint ?
    Par Pill_S dans le forum Composants
    Réponses: 8
    Dernier message: 08/02/2013, 17h38
  2. Différences entre JComponent et JPanel
    Par FaridM dans le forum Débuter
    Réponses: 5
    Dernier message: 07/04/2009, 11h07
  3. Ajouter un JComponent dans un JPanel est ce possible?
    Par jlassiramzy dans le forum AWT/Swing
    Réponses: 5
    Dernier message: 23/04/2007, 21h02
  4. Probleme de JPanel et de paint()
    Par Mom's dans le forum AWT/Swing
    Réponses: 8
    Dernier message: 17/11/2006, 23h32
  5. [JPanel] Placer un JComponent
    Par tck-lt dans le forum Agents de placement/Fenêtres
    Réponses: 6
    Dernier message: 18/07/2005, 09h13

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