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 :

Image à afficher au bon moment


Sujet :

AWT/Swing Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé

    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2009
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2009
    Messages : 50
    Billets dans le blog
    1
    Par défaut Image à afficher au bon moment
    Bonjour à tous !

    J'essaie de faire une application dans laquelle j'aimerais avoir une "image" (c'est en fait un traitement d'une image auquel on rajoute des choses) en fond qui se réactualiserais à chaque fois que la souris clique.

    Pour l'instant, je l'affichais à chaque appel de paintComponent mais le traitement devient lourd et l'affichage s'en ai ressenti.

    J'aimerai donc afficher cette "image" de fond uniquement au premier appel de paintComponent et à chaque fois que la souris clique.

    Néanmoins (si c'était que ça, ça va^^), je veux aussi que lorsque la souris bouge une petite image suive le curseur. Quand je réaffichais à chaque fois, ça ne posait pas de problème, mais lorsque j'ai essayé de ne faire afficher le fond que lorsqu'il y en avais besoin, super.paintComponent(g) effacait le fond et sans le super, j'ai une trace de où est aller mon curseur par la petite image qui suit le curseur.

    J'espère que c'est assez clair, n'hésitez pas à me poser des questions.

    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
     
    public void paintComponent(Graphics g){
    	super.paintComponent(g);//avec, imageFond ne s'affiche pas, sans, ce qui est dessiné par drawCursor ne s'efface pas
     
    	g2d = (Graphics2D)g;
    	g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
    			RenderingHints.VALUE_ANTIALIAS_ON);
    	try {
     
    		if (flagFirstTimeInPain || flagMouseClicked)//pour ne l'afficher que lorsqu'il y en a besoin
    		{
    			imageFond.draw(g2d, step, this);
    			flagFirstTimeInPain = false;
    			flagMouseClicked = false;
    		}
     
     
    		drawCursor();
    	} catch (IOException e) {
    		e.printStackTrace();
    	}
    }
    Merci d'avance !

    Schnuffel

  2. #2
    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
    Bonjour,

    1 - Il ne faut pas que tu stockes tes Graphics2D dans ta classe. Ces graphics ne sont valides que lors de l'exécution de la méthode paintComponent, je te recommande d'ajouter ces graphics en paramètre de ton drawCursor et de les utiliser dedans

    2 - que fais du dans le draw de la classe d'imageFond?

  3. #3
    Membre confirmé

    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2009
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2009
    Messages : 50
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    1- Merci du conseil !

    2- Il affiche une image de fond et dessine dessus un motif composé principalement de lignes et de ronds.
    Plus à chaque clique une image s'affiche là où l'utilisateur a cliqué (et y est enregistrée pour ne pas l'oublier) : donc une image s'affiche à tout les endroits où l'utilisateur a cliqué depuis le lancement du programme.

    Schnuffel

  4. #4
    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
    Sans code je vais avoir du mal à t'aider...

  5. #5
    Membre confirmé

    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2009
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2009
    Messages : 50
    Billets dans le blog
    1
    Par défaut
    Le voici (Board est la classe où était le premier code) :

    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
     
    public void draw(Graphics2D g2d, float step, Board board) throws IOException
    	{
    		//on affiche le bois
    		Image fond = ImageIO.read(new File("img/SPANISH_CEDAR.jpg"));
    		g2d.drawImage(fond, 0, 0, board);
     
    		Stroke s = g2d.getStroke();
    		g2d.setStroke(new BasicStroke(2));
     
    		g2d.setColor(Color.black);
     
    		drawRound(step, g2d);//on affiche les ronds
     
    		drawLines(g2d, step);//on affiche les lignes
     
    		g2d.setStroke(s);
     
    		drawWhereClicked(g2d, step, board);//on affiche une image à chaque endroit où l'utilisateur a cliqué
     
    		if (!historic.isEmpty())
    		{
    			drawCircleInLastClikedArea(g2d, step, guiGoban);//on affiche un cercle autour du dernier clic
    		}
    	}
    Ce que je veux, c'est que ce code ne s'exécute que lorsqu'il y en a besoin, mais sans poser de problème au drawCursor().

  6. #6
    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
    La source de ton problème de perf se trouve à la première ligne de cette méthode.

    Charger une image est une opération couteuse et bloquante. Il ne faut pas la réaliser dans du code servant à dessiner les composant.

    Charge ton image à l'instanciation de ta classe et non dans cette méthode.
    Tu n'auras plus à te poser la question de savoir quand redessiner ou pas, de toute façon tu ne peux savoir à quel moment Swing va appeler la méthode paintComponent, ni le contrôler.

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

Discussions similaires

  1. Afficher une image dans le bon axes
    Par fatima-ben dans le forum Interfaces Graphiques
    Réponses: 9
    Dernier message: 19/05/2011, 00h47
  2. image affiche tous dans la première pages
    Par Invité dans le forum Langage
    Réponses: 12
    Dernier message: 14/12/2005, 03h43
  3. Réponses: 15
    Dernier message: 01/12/2005, 17h18
  4. [C#] comment afficher le bon contextmenu dans 1 listview?
    Par irnbru dans le forum Windows Forms
    Réponses: 4
    Dernier message: 09/11/2005, 22h55
  5. [images] afficher une image en fond d'ecran
    Par soulhouf dans le forum Windows
    Réponses: 8
    Dernier message: 19/09/2005, 20h03

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