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 :

[Swing] Question sur le repaint


Sujet :

AWT/Swing Java

  1. #1
    Membre éprouvé Avatar de BainE
    Inscrit en
    Mai 2004
    Messages
    1 327
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 1 327
    Par défaut [Swing] Question sur le repaint
    Bonjour,

    je suis en train de customiser mon application, et je viens de tomber sur un point qui me pose des (une en tout cas). Je suis sur un JDialog, et je voudrais lui mettre une image en fond.
    Ca ca marche, j'ai galéré un peu mais c'est bon.

    Pourquoi est-ce uniquement la methode
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    public void repaint( int x, int y, int width, int heigth )
    qui est appelée et pas repaint() basic ?

    Question auxilaire
    Est il possible de poser un JTextFiled sur l'image ?
    Actuellement, l'image est par dessus, c'est pas top...

  2. #2
    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
    J'ai pas tout saisi pour la première question...
    Pour la seconde, peut-être qu'un JLayeredPane te conviendra ?

  3. #3
    Membre éprouvé Avatar de BainE
    Inscrit en
    Mai 2004
    Messages
    1 327
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 1 327
    Par défaut
    Pour le premeire question, au debut de mes essai l'image s'affichait bien.
    Mais j'ai un JPanel caché qui s'affiche au clic d'un bouton.
    Quand je cliquait dessus, la dialog changeait de taille mais ne repeignait as l'image.

    Pas tetu j'ai Overridé toutes les methodes repaint.
    Je me suis apercu que c'est le repaint cité plus haut qui était appelée et pas celle redéfinie au début (par moi) : repaint().

    Pour la deuxieme question, j'ai fait un setIgnoreRepaint sur les TextField concerné et je les repaint apres l'image, ca marche nikel...

  4. #4
    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
    Citation Envoyé par BainE
    Pour la deuxieme question, j'ai fait un setIgnoreRepaint sur les TextField concerné et je les repaint apres l'image, ca marche nikel...
    C'est un peu bourrin, mais ça a le mérite de marcher...

    Citation Envoyé par BainE
    Pas tetu j'ai Overridé toutes les methodes repaint.
    Houlà ! Effectivement, tu ne recules devant rien !
    Mais je doute fort qu'il faille redéfinir cette méthode (plutôt globale) à chaque fois que l'on souhaite afficher une image... Le graphisme Java n'est pas mon fort, mais n'est-ce pas plutôt paintComponent() qu'il faut redéfinir ?

  5. #5
    Membre éprouvé Avatar de BainE
    Inscrit en
    Mai 2004
    Messages
    1 327
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 1 327
    Par défaut
    oui mais il n'est jamais passé dedans...
    Les subtilités de swing (me) semble assez obscure.

    Peut j oublie une declaration je sais pas, mais du cout je suis parti sur paint et repaint

  6. #6
    Membre éclairé
    Avatar de seiryujay
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 950
    Par défaut
    Je ne sais pas exactement ce que tu as fait pour dessiner une image en fond de ta JDialog, mais je te conseille de jeter un coup d'oeil là-dessus : ça pourra simplifier ton code et t'éviter bien des soucis.

  7. #7
    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
    Il doit surement exister bons nombres de tutoriaux ou exemples pour ce qui est d'afficher une image... Quand la javadoc ne suffit pas, rien ne vaut le "code-exemple" ! (edit : voir justement au-dessus !)

    Tout ce que je peux te dire, c'est qu'à chaque fois que j'ai travaillé avec des image dans un panel, c'était paintComponent(Graphics g) qui se chargeait de dessiner, et repaint() (non redéfini) qui appelait cette méthode pour re-dessiner...

    Désolé de ne pas pouvoir plus t'aider !

  8. #8
    Membre éprouvé Avatar de BainE
    Inscrit en
    Mai 2004
    Messages
    1 327
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 1 327
    Par défaut
    Ho, ce que je fais ne casse pas trois pattes a un canard...
    Creation de l image dans le constructeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Image image = Toolkit.getDefaultToolkit().getImage( "path\\fond.png" );
    Et surcharge de paint et repaint
    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
     
    @Override
    	public void paint( Graphics g ){
    		super.paint( g );
    		Graphics gc = g.create( 10, 10, image.getWidth( this ), image.getHeight( this ) );
            ((Graphics2D)gc).setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.15f ));
    		gc.drawImage(image,0,0,this);
    		gc.dispose();
     
                    //pour qu'ils soit par dessus l'image de fond
    		txtLogin.paint( txtLogin.getGraphics() );
    		txtPwd.paint( txtPwd.getGraphics() );
    		btnOption.paint( btnOption.getGraphics() );
    	}
     
    	@Override
    	public void repaint( int x, int y, int width, int heigth ){
    		super.repaint();
    		Graphics gc = this.getGraphics().create( 10, 10, image.getWidth( this ), image.getHeight( this ) );
    	    ((Graphics2D)gc).setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.15f ));
    		gc.drawImage(image,0,0,this);
    		gc.dispose();
     
                    //pour qu'ils soit par dessus l'image de fond
    		txtLogin.repaint();
    		txtPwd.repaint();
    		btnOption.repaint();
    	}
    Ca va pas tres loins

  9. #9
    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
    Ne surcharge ni paint(), ni repaint(), mais paintComponent(). Cela résoudra tous tes problèmes et l'image sera affichée derrière les composants.

    Note aussi que tu n'as pas vraiment besoin de créer un nouveau Graphics avec create().

  10. #10
    Membre éclairé
    Avatar de seiryujay
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 950
    Par défaut
    On m'a toujours vivement déconseillé de surcharger la méthode paint(), et je ne saurai trop te conseiller d'en faire autant.
    Tu remarqueras que dans l'exemple que je t'ai donné, il n'y a pas d'appel à la méthode super.paintComponent().
    C'est entre-autre pour ça qu'on conseille de surcharger paintComponent() et non pas paint().

    Après peut-être que cette méthode n'est pas applicable à ton cas, mais attention à la surcharge de paint()...

  11. #11
    Membre éprouvé Avatar de BainE
    Inscrit en
    Mai 2004
    Messages
    1 327
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 1 327
    Par défaut
    on parle bien de la methode paintComponents de Container ?
    Si oui quand je fais ca
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    @Override
    	public void paintComponents( Graphics g ){
    		System.err.println( "PAINT COMPONENTS" );
    		JOptionPane.showMessageDialog( this , "PAINT COMPONENTS" );
    	}
    je ne passe jamais dedans ?
    il faut declarer la classe au "manager de repaint" ?

  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
    paintComponent(), pas paintComponents()... il n'y a pas de 's'.

    Tu remarqueras que dans l'exemple que je t'ai donné, il n'y a pas d'appel à la méthode super.paintComponent().
    C'est entre-autre pour ça qu'on conseille de surcharger paintComponent() et non pas paint().
    Rien à voir. On doit surcharger paintComponent() au lieu de paint() car paint() se charge de nombreuses autres choses que le seul dessin du composant : dessin des enfants, dessin des bordures mais aussi et surtout la gestion du double buffering.

  13. #13
    Membre éprouvé Avatar de BainE
    Inscrit en
    Mai 2004
    Messages
    1 327
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 1 327
    Par défaut
    je veux bien mais "paintComponent" est une methode de JComponent, or JDialog n'herite pas de JComponent.

    C'est la que ca coince...

  14. #14
    Membre éclairé
    Avatar de seiryujay
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 950
    Par défaut
    Je me suis mal exprimé...
    Ce que je voulais dire c'est que dans l'exemple de la FAQ, on n'appelle pas super.paintComponent() afin que la méthode surchargée fasse exactement ce que l'on veut (autrement dit, juste dessiner l'image en fond).

    Or s'il voulait faire la même chose avec paint(), il zapperait beaucoup de choses que tu listes d'ailleurs toi-même.

    Et je ne suis pas sûr que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    protected void paintComponent(Graphics g) {
       super.paintComponent();
       // ton code
    }
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    protected void paintComponent(Graphics g) {
       // ton code
    }
    donnent le même résultat... (tu m'arrêtes si je dis une bêtise)

  15. #15
    Membre éprouvé Avatar de BainE
    Inscrit en
    Mai 2004
    Messages
    1 327
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 1 327
    Par défaut
    oui, mais il est dit dans le tuto de sun, qu'un developpeur que redefini la methode paint accepte tacitement lle contrat de repeindre "tout", et il me semble qu'ils disent un appel a super.methodeDePaint() en debut de surcharge est de bon ton.

  16. #16
    Membre éclairé
    Avatar de seiryujay
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 950
    Par défaut
    Regarde le lien que je t'ai mis vers la FAQ...
    Et regarde ce post où un autre membre a fait la même erreur que toi

  17. #17
    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
    Oubliez la méthode paint(), surchargez paintComponent(), c'est tout.

    BainE > Au lieu de surcharger paintComponent() dans un JDialog, surcharge-le dans un JPanel et place ce JPanel dans ton JDialog.

    seiryujay > Les résultats sont en effet différents mais cela ne change rien. Par exemple si tu surcharges paintComponent() dans un JPanel tu peux vouloir centre l'image dans le panel et conserver la couleur de fond par défaut, auquel cas il est normal d'appeler super.paintComponent().

  18. #18
    Membre éprouvé Avatar de BainE
    Inscrit en
    Mai 2004
    Messages
    1 327
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 1 327
    Par défaut
    Quelle astuce de siou !!!
    Ca marche impecable

    Merci

    P.S. : j'avais bien vu cette partie de la FAQ, je l'avais pas comprise comme ca, de plus j'ai été perturbée par une faute d'orthographe :"paintComponant", alors je me suis dis qu'il y en avait peut etre une deuxieme sur le "s" final.
    J'ai honte,
    Je ne mettrais plus en doute les tutos des redacteurs.

    Merci a vous trois

  19. #19
    Membre éclairé
    Avatar de seiryujay
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 950
    Par défaut
    Citation Envoyé par Gfx
    seiryujay > Les résultats sont en effet différents mais cela ne change rien. Par exemple si tu surcharges paintComponent() dans un JPanel tu peux vouloir centre l'image dans le panel et conserver la couleur de fond par défaut, auquel cas il est normal d'appeler super.paintComponent().
    C'est vrai, j'avais pas pensé à ce genre de cas.
    Merci pour les éclaircissements.

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

Discussions similaires

  1. Question sur la gestion des swing
    Par donnadieujulien dans le forum AWT/Swing
    Réponses: 3
    Dernier message: 11/07/2008, 11h32
  2. petite question sur repaint()
    Par skwi6 dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 07/11/2006, 13h45
  3. Question sur Swing sur MacOsX
    Par kedare dans le forum AWT/Swing
    Réponses: 6
    Dernier message: 31/07/2006, 22h59
  4. [swing] Petite question sur JColorChooser
    Par yupa dans le forum AWT/Swing
    Réponses: 7
    Dernier message: 14/01/2006, 09h08
  5. [SWING] Question sur : JOptionPane.showMessageDialog
    Par Invité dans le forum Agents de placement/Fenêtres
    Réponses: 2
    Dernier message: 14/12/2005, 12h15

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