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 :

Ecrire sur une image


Sujet :

AWT/Swing Java

  1. #1
    Membre confirmé
    Inscrit en
    Septembre 2007
    Messages
    233
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 233
    Par défaut Ecrire sur une image
    bonjour tout l monde ,

    j'ai un probleme avec mon application il s'agit d'une frame ou j'ajoute une image a l'un de ses jpanel ,et j'aimerai ecrire un text(variable) que je recuper apres .don ça revien à ecrire un text dans une image dans un endroit precis (coordonnée) voila comment je crée mon image :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    JLabel lab =new JLabel(new imageIcon("image.gif");
    jpanel.add(lab) ;
    merci.

  2. #2
    Membre chevronné Avatar de ngpub
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    449
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 449
    Par défaut
    Une solution consiste à créer un composant perso et surcharger la méthode paintComponent(Graphics g).

  3. #3
    Membre confirmé
    Inscrit en
    Septembre 2007
    Messages
    233
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 233
    Par défaut
    Citation Envoyé par ngpub Voir le message
    Une solution consiste à créer un composant perso et surcharger la méthode paintComponent(Graphics g).
    Si j'ai bien compris votre alternative je met en arrier plan l'mage puis j'ecit desusu, en plsu pouvez vous me donner un exemple de code pour metre comme image de fond pour mon panel (jpanel) .

    merci

  4. #4
    Membre chevronné Avatar de ngpub
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    449
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 449
    Par défaut
    Voici un début d'exemple
    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
    class ImageComponent extends JComponent {
     
    	private Image image = null;
    	private String text = null;
     
    	...
     
    	@Override
    	protected void paintComponent(Graphics g) {
    		super.paintComponent(g);
     
    		if(image != null) {
    			g.drawImage(image, 0, 0, this);
    		}
     
    		if(text != null) {
    			g.drawString(text, 12, 240);
    		}
    	}
    }

  5. #5
    Membre confirmé
    Inscrit en
    Septembre 2007
    Messages
    233
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 233
    Par défaut
    je trouve aussi des erreur pour le chargement de l'image car avant je la mettais dans un jlabel et dans ce cas comment puis je la cahrger via un autre moyen que le jlabel,
    car a mon avis le jlabel ne me sert a rien ds ce cas
    en plus mon jpanel est dans une autre frame donc je pourrais avoir des soucis avec la redefinition du conponent (public class...)

  6. #6
    Membre chevronné Avatar de ngpub
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    449
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 449
    Par défaut
    Citation Envoyé par Viscapon Voir le message
    le jlabel ne me sert a rien ds ce cas
    Effectivement.
    Cela étant dit, pour rester dans la ligne du JLabel, rien n'empêche de créer un constructeur qui prend comme argument une image.

    Citation Envoyé par Viscapon Voir le message
    en plus mon jpanel est dans une autre frame donc je pourrais avoir des soucis avec la redefinition du conponent (public class...)
    Je ne comprends pas le problème ...

  7. #7
    Membre confirmé
    Inscrit en
    Septembre 2007
    Messages
    233
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 233
    Par défaut
    desole mais j'arrive tjs pas a voire votyre iddée
    cepnedant j'avait penser a la tactic suivante vue que je ss un peut preser par le resultat:
    j'affiche l'conne en premire lieu avec le jlabel puis l'ecrit des jlbale autres avec la methode setBounds apres avoir forcer le layout a null
    mais ça donne pas les resultat comme j'esepre.
    peute etre puvez vous me sugger une iddée dans ce sens ?

  8. #8
    Membre chevronné Avatar de ngpub
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    449
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 449
    Par défaut
    Citation Envoyé par Viscapon Voir le message
    peute etre puvez vous me sugger une iddée dans ce sens ?
    Non, les layouts nuls ou un empilement de JLabels ce ne sont pas des bonnes idées de plus je ne suis pas sûr qu'il y ai un gain de temps.

    Dans l'exemple, pour que cela fonctionne, il manque juste les méthodes pour affecter l'image et le texte.
    comment l'avez vous adapté ? qu'est-ce qui vous pose problème ?

  9. #9
    Membre confirmé
    Inscrit en
    Septembre 2007
    Messages
    233
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 233
    Par défaut
    le problem je ne voit rien ni image ni lebel,
    voila comment je procede en gros et votre avis me sera d'une aide precieuse :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    graphics g =(graphics) panel.get>Graphics;
    g.drawImage (image,10,40,null);//image j'utilise le jlabel !!
    g.drawString("sdsd");
     
    panel.paint(g);
    de plus ceci se trouve dans une actionlisnetr donc je peut pas redefinir de class public pour le component .voila .
    de plus lors de l'apple de image esct ce que je peut utiliser le label qui contien cad l'mage c'est le jlabel .
    merci

  10. #10
    Membre chevronné Avatar de ngpub
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    449
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 449
    Par défaut
    Pour commencer une règle de base quand on débute : on de dessine JAMAIS un composant à l'extérieur de lui-même.

    Sinon je ne connais pas le problème mais l'on pourrait trouver quelque chose comme ça :
    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
    class MaFrame extends JFrame {
     
    	private ImageComponent imageComponent;
     
     
    	public MaFrame() {
    		imageComponent = new ImageComponent(new imageIcon("image.gif").getImage());
    		getContentpane.add(imageComponent, ...);
    		...
    	}
     
    	...
     
    	public void actionPerformed(ActionEvent event) {
    		imageComponent.setText("sdsd");
    		imageComponent.repaint();
    	}
    }

  11. #11
    Membre confirmé
    Inscrit en
    Septembre 2007
    Messages
    233
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 233
    Par défaut
    Pour commencer une règle de base quand on débute : on de dessine JAMAIS un composant à l'extérieur de lui-même.
    je defini un panel dans le constructeur de ma classe frame

    puis je gere l'affichage de ce panel dans un mouselistner dans un bouton du meme frame donc comment je doit gerer en dehors du panel d'apres mon simple point de vue .
    je peut pas mettre le code de tt la frame car c vraiment un code tres long et mnt je doit gere l'evenment du bouton c la ou le jpanel affiche l'mage.

  12. #12
    Membre confirmé
    Inscrit en
    Septembre 2007
    Messages
    233
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 233
    Par défaut
    de plus ma frame ne reconnait pas cette partie du code (erreur)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
    public MaFrame() {
    		imageComponent = new ImageComponent(new imageIcon("image.gif").getImage());
    		getContentpane.add(imageComponent, ...);
    		...
    	}

  13. #13
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    On ne dessine jamais délibérément sur un composant. On le fait toujours, soit depuis la méthode paintComponent(), soit depuis la méthode paint(), méthode que l'on surcharge. Si maintenant, tu as besoin de redessiner ton composant en réponse à un changement dans ton mouseListener (exemple bête, tu veux que l'image suive la souris), dans le mouseListener, tu dois appeler la méthode repaint() de ton composant, qui va l'informer qu'il est temps de penser à se redessiner.

  14. #14
    Membre confirmé
    Inscrit en
    Septembre 2007
    Messages
    233
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 233
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    On ne dessine jamais délibérément sur un composant. On le fait toujours, soit depuis la méthode paintComponent(), soit depuis la méthode paint(), méthode que l'on surcharge. Si maintenant, tu as besoin de redessiner ton composant en réponse à un changement dans ton mouseListener (exemple bête, tu veux que l'image suive la souris), dans le mouseListener, tu dois appeler la méthode repaint() de ton composant, qui va l'informer qu'il est temps de penser à se redessiner.
    donc je doit redefinir un rapint classic avec avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public staic paintCompenet(Graphics g){
    code classic
     
    }
    puis la rappeler au momnet venu ,

    si c'est oui , alors dans mon mouse lisnter j'affcet un gr (Graphics ) pour mon jpanel puis je padifie le gr (cad g dans la declaration) ??

  15. #15
    Membre chevronné Avatar de ngpub
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    449
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 449
    Par défaut
    Citation Envoyé par Viscapon Voir le message
    je defini un panel dans le constructeur de ma classe frame
    C'est ce que montre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public MaFrame() { // indique que l'on est dans le constructeur
    	imageComponent = new ImageComponent(new imageIcon("image.gif").getImage());
    	getContentpane.add(imageComponent, ...);
    	...
    }
    au lieu d'utiliser un panel utilise un ImageComponent puis les méthodes setImage(Image) et setText(String) pour modifier l'image ou le texte quand tu en as besoin. puis finis par un repaint() pour mettre à jour l'affichage.



    Citation Envoyé par Viscapon Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public staic paintCompenet(Graphics g){
    code classic
     
    }
    Attention la methode pour dessiner dans un composant est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    protected void paintComponent(Graphics g) {...}
    Citation Envoyé par Viscapon Voir le message
    puis la rappeler au momnet venu ,

    si c'est oui , ...
    C'est non, tu dois utiliser repaint() pour mettre à jour l'affichage. C'est La méthode repaint() qui appellera paintComponent(Graphics g) pour dessiner le composant.

  16. #16
    Membre confirmé
    Inscrit en
    Septembre 2007
    Messages
    233
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 233
    Par défaut
    au lieu d'utiliser un panel utilise un ImageComponent puis les méthodes setImage(Image) et setText(String) pour modifier l'image ou le texte quand tu en as besoin. puis fini par un repaint() pour mettre à jour l'affichage.
    Donc vous me proposer de gerer en premier lieu mon ImageComponent (ajout d'lmage +ecritur)

    et dans mon mouselisnter j'ajoute ce ImageComponent a mon panel puis le rafrechir biensur.

    Desole d'avoir a poser tt ces question mais j'ai pas mal d'ambiguité concernat le dessin dans swing et il me reste cette partie de dessin pour finir mon projet .

  17. #17
    Membre chevronné Avatar de ngpub
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    449
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 449
    Par défaut
    Citation Envoyé par Viscapon Voir le message
    Donc vous me proposer de gerer en premier lieu mon ImageComponent (ajout d'lmage +ecritur)
    Je propose surtout de créer un objet (composant graphique) qui gère l'affichage d'une image et d'un texte. Après une fois créé et en fonction du problème, à vous de voir où doivent être indiqués un nouveau texte ou une nouvelle image.

    Citation Envoyé par Viscapon Voir le message
    et dans mon mouselisnter j'ajoute ce ImageComponent a mon panel puis le rafrechir biensur.
    A part dans des cas particuliers, on ajoute pas un composant lors du traitement d'un événement (dans une méthode de listener), on l'ajoute une fois pour toute lors de l'initialisation (souvent dans le constructeur) puis lors de l'événement ont utilise les méthodes de l'objet déjà existant.

  18. #18
    Membre confirmé
    Inscrit en
    Septembre 2007
    Messages
    233
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 233
    Par défaut
    Bon si j'ai bien compris vos suggestions durrant vos reponce cad je redefinit la methode paintConpnont pour un Graphics ou j'ajoute l'image desire en arriere plans puis les text avec la methofe drawString ,et enfin j'apllique cette methode redefinit (paintConpnont ) sur le Graphivs de mon panel lors du muse listner ,c'est vrai que j'ai pas mal de lacune concernant tous ce qui consrne les paintConpnont et dessin sur swing j'aimerais bien si vous avaez un cours cible ou faq pour ça ,sinon esct j'ai bein compris la procedur voila la partie du code que j'ai modifier :

    da'bord je redefinit la methode paint :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     
      	public void paintComponent(Graphics g){
     
     
     
                		ImageIcon ic=new ImageIcon(getClass().getResource("C:\\l.gif"));
                		Image fond =ic.getImage();
     
                		g.drawImage(fond,0,0,1024,680,this);
                	}

    puis dans mon listner je fait:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     
    paintComponent(Panneauprime.getGraphics());
     
                                                   			 Panneauprime.revalidate();
                                                   			 Panneauprime.repaint();
    El la question qui m'intrigue le plus apres une petite recherche sur le net c comment faire le lien entre la methode "paintComponent" et mon jpanel commeça seul mon jpanel aura une image de fond que je veut .

    voila .

  19. #19
    Membre chevronné Avatar de ngpub
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    449
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 449
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    paintComponent(Panneauprime.getGraphics());
    La méthode paintComponent NE DOIT PAS être appelée, il faut juste appeler "Panneauprime.repaint()" qui elle se chargera d'appeler paintComponent.

  20. #20
    Membre confirmé
    Inscrit en
    Septembre 2007
    Messages
    233
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 233
    Par défaut
    Voila j'epere que cette fois je vous comprend,
    d'abord je redefinit pas ma methode paintComponent pour tout g mais sauf pour mon paneu(Panneauprime.getGraphics() ) et ça au debut de ma classe frame (avant le mouselistner) qui contient les pannaux ect ...
    puis dans mon action listner je fait un rpaint pour mon panau (Panneauprime).

    c ça ?

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

Discussions similaires

  1. Ecrire sur une image
    Par alliance dans le forum Langage
    Réponses: 7
    Dernier message: 22/01/2010, 16h32
  2. ecrire sur une image ?
    Par messahel dans le forum Langage
    Réponses: 1
    Dernier message: 03/10/2009, 02h37
  3. Réponses: 2
    Dernier message: 18/03/2009, 20h17
  4. [HTML] Ecrire sur une image
    Par machipot dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 10/01/2007, 17h52

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