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

 Java Discussion :

Refresh la source URL d'une image


Sujet :

Java

  1. #1
    Membre à l'essai
    Homme Profil pro
    Enseignant
    Inscrit en
    Mai 2017
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Mai 2017
    Messages : 19
    Points : 11
    Points
    11
    Par défaut Refresh la source URL d'une image
    Bonjour,
    La classe Fond de mon programme s'occupe (entre autres choses) d'afficher une image de fond dans un Jframe via la méthode paintComponent().
    Pour afficher l'image de fond on utilise les lignes de code suivantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public void paintComponent(Graphics g){
    		super.paintComponent(g);
    		Graphics g2 = (Graphics2D)g;
     
    		//Fond
    		icoFond = new ImageIcon(getClass().getResource("img/FondModifiable.jpg"));
    		this.fond = this.icoFond.getImage();
    		g2.drawImage(this.fond,0,0,null);
    Une autre classe de mon programme s'occupe de modifier l'image FondModifiable.jpg. Cette classe fait bien son boulot puisque je vérifie bien (visuellement) que l'image FondModifiable.jpg est changée lorsqu'on appelle une méthode de cette classe.
    Le soucis c'est que la classe fond ne semble pas prendre en compte ce changement. Un exemple pour mieux comprendre :
    Mettons que l'image de base soit bleue. Après modification elle devient rouge. Cependant le programme l'affiche tjrs bleue. Par contre si j'éteint le programme et que je le relance, cette fois l'image est bien rouge ...
    J'ai fait quelques recherches concernant le refresh d'image Image. Il semble plus adapté d'utiliser les BufferedImage. Cependant si je rafraichit la source de cette bufferedImage dans la méthode PaintComponent(), j'ai une chute monstrueuse de FPS... Donc je ne sais que faire.
    Merci d'avance pour vos réponses.

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    D'abord tu ne devrais pas créer un ImageIcon dans paintComponent. Le chargement est asynchrone. Ton code marche parce que l'image et gardée en cache (ce qui cause aussi le fait que ça ne change plus). Donc sur les premiers paintComponent, ca donne aléatoire. Puis quand le chargement asynchrone a fini, les appels suivants chargent depuis le cache de manière synchrone.

    Pour ne pas avoir de cache, il faut utiliser ImageIO.read

    et cet appel doit être fait en dehors de paintComponent, car il est lent.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Enseignant
    Inscrit en
    Mai 2017
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Mai 2017
    Messages : 19
    Points : 11
    Points
    11
    Par défaut
    J'ai donc modifié selon tes préconisations.
    J'ai mis le ImageIO.read directement dans la méthode qui modifie le fichier image, comme ça je n'update mon fond que si il est effectivement modifié. Du coup plus de lag permanent.
    Par contre j'ai bien un temps de latence au moment de l'update. Je m'explique :
    En gros pour tester tout, lorsque j'appuie sur un bouton du clavier, la modif de l'image se fait, et update donc le fond dans mon Jframe. Sauf qu'entre le moment où j'appuis sur la touche, et le moment où l'image s'update il y a bien une demie seconde. Enfin je sais pas exactement mais c'est visible. Est ce normal ? Y a t'il un moyen de contourner cela ?
    Merci pour ta réponse en tout cas.
    EDIT : Cette méthode est sensé dessiner chaque pixel aléatoirement (on appelle un boolean aléatoirement pour chaque pixel). Du coup la construction de l'image me semble assez lente ce qui risque de poser soucis pour le reste du programme qui sera en attente tant que ce fichier image n'aura pas été construit. Du coup y'as t'il un moyen, une autre "méthode" pour contourner ce problème ?

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Il faudrait voir ton code, et il faudrait que tu mesure quelle partie est lente. Au passage, pourquoi créer, écrire puis lire l'image plutot que de l'utiliser directement?

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