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

GTK+ Discussion :

[Java] images s'affichant l'une en dessus de l'autre


Sujet :

GTK+

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2006
    Messages
    114
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2006
    Messages : 114
    Par défaut [Java] images s'affichant l'une en dessus de l'autre
    Bonjour
    Je developpe une application avec java-gnome utilisant GTK+.
    La fonction suivante affiche une image qui correspond à un choix dans un TextComboBox

    public void addImage(String fileName){


    Image image = new Image("images/"+fileName+".jpg");

    int width = image.getRequisition().getWidth();
    int height = image.getRequisition().getHeight();
    image.setSizeRequest(width, height);
    image.showAll();

    fix.put(image,320,120);

    }
    fix est un Fixed.

    mais à chaque fois que l'image change, l'ancienne image reste affiché, et la nouvelle s'affiche en dessus.
    Comment je pourrai remedier à ce probleme ?

  2. #2
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 308
    Billets dans le blog
    5
    Par défaut
    Il faut détruire l'image précédente avant l'affichage de la nouvelle. Pour ca il te faut conserver l'objet "image" précédent.
    Je n'ai jamais utiliser gtk+ sous java mais je suppose qu'une méthode du type widget_destroy(); doit bien exister.

  3. #3
    Modérateur

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    1 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 395
    Par défaut
    A priori je dirais que comme tu ne fais qu'ajouter ton image à une élément dérivé de GtkContainer (ton GtkFixed), ce dernier retient toujours une référence sur l'image précédente. Chose confirmée par la lecture du source contenant gtk_fixed_put:
    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
    void
    gtk_fixed_put (GtkFixed       *fixed,
                   GtkWidget      *widget,
                   gint            x,
                   gint            y)
    {
      GtkFixedChild *child_info;
     
      g_return_if_fail (GTK_IS_FIXED (fixed));
      g_return_if_fail (GTK_IS_WIDGET (widget));
     
      child_info = g_new (GtkFixedChild, 1);
      child_info->widget = widget;
      child_info->x = x;
      child_info->y = y;
     
      gtk_widget_set_parent (widget, GTK_WIDGET (fixed));
     
      fixed->children = g_list_append (fixed->children, child_info);
    }
    On voit que ton GtkFixed devient explicitement le parent de ton widget image. Tant que tu n'as pas rompu cette liaison, une référence est conservée et l'ancienne image ne peut être détruite. En gros : ajouter de nouvelles image n'enlève pas les précédentes. GtkFixed n'a pas l'air de permettre ça, on regarde donc la classe mère, GtkContainer. Et oh magie, il existe gtk_container_remove.

    Il indique d'ailleurs spécifiquement ce comportement, vu qu'il n'est pas spécifique au langage C mais à GObject. En revanche pour le Java, c'est le principe même du garbage collector: un object vers lequel plus personne n'a de référence est détruit.
    Removes widget from container. widget must be inside container. Note that container will own a reference to widget, and that this may be the last reference held; so removing a widget from its container can destroy that widget. If you want to use widget again, you need to add a reference to it while it's not inside a container, using g_object_ref(). If you don't want to use widget again it's usually more efficient to simply destroy it directly using gtk_widget_destroy() since this will remove it from the container and help break any circular reference count cycles.
    Mais la doc indique d'ailleurs que gtk_widget_destroy est plus indiqué si tu ne souhaites pas réutiliser le widget en question, comme le disait gérard. La solution la plus simple à ton problème est donc de définir ton image en static, et détruire la précédente avant d'affecter une nouvelle.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Image image = NULL;
    if (image != NULL)
    {
         /* appeler l'équivalent Java de gtk_widget_destroy (image) */
    }
     
    image = new Image("images/"+fileName+".jpg");
    [...]
    PS: faire des chemins de fichiers comme ça, c'est sale et pas portable ;-)
    Il doit y avoir un équivalent de g_build_filename soit dans java, soit dans la version java de la glib.

Discussions similaires

  1. afficher un controle au dessus d'un autre
    Par wannabi dans le forum ActionScript 3
    Réponses: 1
    Dernier message: 15/10/2008, 14h58
  2. Réponses: 9
    Dernier message: 27/01/2006, 18h00
  3. [Afficher une image] Comment afficher une impression écran ?
    Par mnina dans le forum Mode d'emploi & aide aux nouveaux
    Réponses: 2
    Dernier message: 10/11/2005, 10h30
  4. [W3C] Est-il possible d'afficher un div par dessus une applet ?
    Par drinkmilk dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 23/02/2005, 10h22
  5. Réponses: 1
    Dernier message: 16/02/2005, 12h04

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