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 :

Superposition de plusieurs Container


Sujet :

AWT/Swing Java

  1. #41
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Je doute vu que je ne l'utilise pas dans mon code.

    Par le plus grand des hasards, tu n'aurais pas oublié d'appeler le start de tes threads (on sait jamais )?

  2. #42
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 90
    Par défaut
    Les threads des animations sont bien démarrés mais alors je suis tombé sur quelque chose d'étonnant, les images des animations ne s'affichent plus, ainsi que les fonctions paint() des animations ne sont plus appelées, il passe bien dans la boucle qui appelle repaint() mais il ne rentre pas dans les fonctions paint().

    Alors j'aurai une question, les coordonnées de placement d'un composant ont bien pour référence le (0, 0) de son composant père ?

    Est-ce que si AWT dans la fonction repaint() voit que le composant que l'on veut redessiner n'est pas affiché dans la zone (0, 0, width, height) de son père, il prend la peine d'appeler paint() ?

    Parce que c'est la seule chose qui ait changée qui pourrait expliquer que je ne vois plus les images des boutons. Les Menus aussi ont leur propres images, et celles ci s'affichent correctement.

    Peut on délimiter avec un trait les bordures d'un composants ?

    Est-ce que le simple appel à setVisible(false) suffit à cacher un composant ? Parce que, dans mon cas, il ne suffit pas et le composant n'est pas effacé de l'écran totalement.

  3. #43
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Euh juste comme ça, tu a bien supprimé la redéfinition d'update que tu avais dans tes composant? Car elle était vide et de fait la méthode paint n'était plus appelée dedans.

    Sinon pour dessiner les bordures d'un composant AWT: http://www.jguru.com/faq/view.jsp?EID=568847

  4. #44
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 90
    Par défaut
    Oui je les ai supprimées, elles étaient aussi dans Menu et Button et j'ai tout enlevé, je cherche encore pourquoi il ne va plus dans les méthodes paint(), tu penses que ca peut avoir un rapport avec les questions que je t'ai posé ?

    Merci.

  5. #45
    Membre expérimenté Avatar de uhrand
    Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2009
    Messages
    203
    Détails du profil
    Informations personnelles :
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 203
    Par défaut
    Citation Envoyé par Cbonniot Voir le message
    je cherche encore pourquoi il ne va plus dans les méthodes paint()
    Si tu n'entre pas dans paint(), c'est que le composant n'est pas visible. Tu peux faire le test en ajoutant qulequechose comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    System.out.println(isShowing() + " " + getClass().getName()); 
    Component parent = getParent(); 
    while (parent != null) { 
        System.out.println(parent.isShowing() + " " + parent.getClass().getName()); 
        parent = parent.getParent(); 
    }
    Tu as peut-être créé deux instances du même composant: un des deux est visible à l'écran et l'autre est invisible. Tu fais les repaint() sur celui qui est invisible: c'est pas étonnant dans ce cas qu'il ne se passe rien à l'écran!

    Ou le composant est caché par un autre composant ou Container.

    Ou la grandeur (getSize()) n'est pas bonne: si elle est zéro, la méthode paint n'est pas appelée.

    Ou il y a un problème dans paint: tu peux facilement vérifier si paint n'est vraiment pas exécutée en ajoutant ceci à l'intérieur de la méthode paint:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.out.println("paint a été exécutée");

  6. #46
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 90
    Par défaut
    Ou il y a un problème dans paint: tu peux facilement vérifier si paint n'est vraiment pas exécutée en ajoutant ceci à l'intérieur de la méthode paint:
    Code :

    System.out.println("paint a été exécutée");
    Ca je l'ai fais, c'est comme ca que je le sais qu'il ne rentre pas dedans.

    Ou la grandeur (getSize()) n'est pas bonne: si elle est zéro, la méthode paint n'est pas appelée.
    Les Containers font la bonne taille, mais ce que je ne comprends pas c'est que il n'y a qu'un bouton sur trois qui est crée, je le sais car je dessine les contours des containers, et il n'y en a qu'un de dessiner. De plus j'ai une image qui se dessine en (0, 0) alors qu'il n'y a jamais ces coordonnées de données.

    Ou le composant est caché par un autre composant ou Container.
    Si le Container du dessus est transparent, il n'empêche pas celui du dessous de s'afficher normalement ?

    J'ai vérifié à grands coups de println(), il rentre dans les fonctions paint de Menu, Button mais pas dans celles des Animatables (voir un peu plus haut pour l'explication de l'arborescence). Et normalement, les Animatables ne sont pas mères et ont pour père un Button ou un Menu, en l'occurence c'est un Button.

  7. #47
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 90
    Par défaut
    J'ai réussi à réafficher une image d'un bouton sur 3, je ne comprends pas pourquoi car c'est la même fonction paint pour chaque bouton. L'erreur venait d'un problème de coordonnées. Mais il ne rentre toujours pas dans les fonctions paint des Animatables.

    Ma question était si on fait this.setVisible(false), va t-il seulement changer l'état de this ou aussi de tous ses descendants ?
    Faut-il appeler repaint() après un setVisible à false ?

    Merci.

  8. #48
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 90
    Par défaut
    Je pense avoir compris, pouvez vous me dire si c'est cela :

    Ma classe Animatable est une classe abstraite où je définis plusieurs méthodes et où je déclare doAnimation()

    Je déclare mes objets de types Animatables (c'est à cet endroit que je définis doAnimation() et paint() ) dans la classe Navigator qui n'étend pas Container et quand j'utilise ce que tu m'as donné uhrand pour voir si le composant est visible, il m'écrit :

    Le false est pour l'appel à isShowing()

    Donc peut être que comme Navigator n'est pas une classe affichable parce qu'il n'étend pas de composant affichable, l'objet Animatable ne s'affiche pas.

    Si je vous demande avant de tester c'est parce que ca m'obligerait à changer beaucoup de choses donc si vous savez, ca me ferait gagner beaucoup de temps !

    Voici le code de Animatable :

    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    package animation;
     
    import java.awt.Container;
     
    import display.Picture;
     
    /**
     * @author Christophe Bonniot
     *
     */
    public abstract class Animatable extends Container implements Runnable {
    	private static final long serialVersionUID = 1L;
    	protected Picture[] picturesList_;
    	protected Container parent_;
    	private boolean isInfinit_;
    	private volatile boolean loop_;
     
     
    	/**
             * 
             * @param picturesList
             * @param isInfinite
             * 
             * Constructor of Animatable, initialize all attributes.
             */
    	public Animatable(Picture[] picturesList, boolean isInfinite) {
    		this.picturesList_ = picturesList;
    		this.isInfinit_ = isInfinite;
    		this.loop_ = this.isInfinit_;
    	}
     
    	/**
             * @param parent
             * 
             * setParent : define which Container is the parent of this object
             */
    	public void setParent(Container parent) {
    		this.parent_ = parent;
    	}
     
    	/**
             * 
             * initializeLoop : restore the initial value of loop
             */
    	public void initializeLoop() {
    		this.loop_ = this.isInfinit_;
    	}
     
    	/**
             * @param on
             * 
             * doLoop : use to stop the thread
             */
    	public void doLoop(boolean on) {
    		this.loop_ = on;
    	}
     
    	/* (non-Javadoc)
    	 * @see java.lang.Runnable#run()
    	 */
    	public void run() {
    		System.out.println("SetVisible Animatable true");
    		this.setVisible(true);
    		// Test if the object is visible or can be
    		System.out.println(isShowing() + " " + getClass().getName()); 
    		Container parent = getParent(); 
    		while (parent != null) { 
    		    System.out.println(parent.isShowing() + " " + parent.getClass().getName()); 
    		    parent = parent.getParent(); 
    		}
    		do {
    			doAnimation();
    		}
    		while ((this.loop_));
    		this.loop_ = this.isInfinit_;
    //		this.setVisible(false);
    	}
     
    	/* (non-Javadoc)
    	 * @see java.awt.Component#toString()
    	 */
    	public String toString() {
    		if (this.isInfinit_)
    			return "Infinite animatable " + super.toString();
    		else
    			return "Limited animatable " + super.toString();
    	}
     
    	/**
             * doAnimation : declaration of the function which will do the animation and show it on the screen
             */
    	public abstract void doAnimation();
    }
    Et voici celui de la définition d'un objet de type Animatable dans la classe Navigator :

    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
    Animatable active1 = new Animatable(pictures1, true) {
            private static final long serialVersionUID = 1L;
            private int loop = 0;
    	public void paint(Graphics g) {
    		Picture p = this.picturesList_[0];
    		System.out.println("Painting active1");
    		if (this.loop == 0) {
    			g.clearRect(p.getX(), p.getY(), p.getWidth(), p.getHeight());
    			g.drawImage(p.getImage(), p.getX() + 10, p.getY(), p.getWidth(), p.getHeight(), null);
    			p.setX(p.getX() + 10);
    		} else {
    			g.clearRect(p.getX(), p.getY(), p.getWidth(), p.getHeight());
    			g.drawImage(p.getImage(), p.getX() - 10, p.getY(), p.getWidth(), p.getHeight(), null);
    			p.setX(p.getX() - 10);
    		}
    		super.paint(g);
    	}
     
    	public void doAnimation() {
    		try {
    			this.loop = 0;
    			for (int i = 0; i < 20; i++) {
    				this.repaint();
    				try {
    					Thread.sleep(50);
    				} catch (InterruptedException e) {
    				}
    			}
    			this.loop = 1;
    			for (int i = 0; i < 20; i++) {
    				this.repaint();
    				try {
    					Thread.sleep(50);
    				} catch (InterruptedException e) {
    				}
    			}
    		} catch (Exception e) {
    		}
    	}
    };

    Merci de votre aide !

  9. #49
    Membre expérimenté Avatar de uhrand
    Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2009
    Messages
    203
    Détails du profil
    Informations personnelles :
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 203
    Par défaut
    Citation Envoyé par Cbonniot Voir le message
    Je déclare mes objets de types Animatables ... dans la classe Navigator qui n'étend pas Container
    L'endroit où tu déclare un objet n'est pas important dans ce contexte. Il faut juste que l'objet et tous ses parents soient visibles. De par sa nature, Navigator ne peut pas être le parent d'un Animatable. Si j'interprète bien "false main.Navigator$2", il s'agit la d'une classe anonyme (indiquée par $2) à l'intérieur de Navigator. En fin de compte, je reste convaincu que tu auras rapidement la solution en construisant un court exemple indépendant et compilable

  10. #50
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 90
    Par défaut
    sinok m'en avait déja donné un, et je comprends très bien comment il fonctionne et au niveau du code des animations, j'ai la même chose, c'est pour ca que je pense que le problème ne vient pas de la, mais je ne sais pas d'où. Si je fais un simple appel à repaint(), il ne va pas dans la fonction paint de l'animation alors que l'appel à isShowing revoie true.

  11. #51
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 90
    Par défaut
    Bon, c'était une erreur stupide le fait que je ne rentrais pas dans paint et j'ai trouvé (getBounds de l'animation renvoyait [0, 0, 0, 0]), il rentre bien dedans mais ca ne marche pas correctement encore.

    En tout cas, il joue des animations (pas exactement les miennes mais ca, ca doit être des erreurs dans le code de l'animation ) et il réaffiche ce qu'il y a derrière, avec un peu de retard mais c'est pareil ca doit être un petit problème.

    Je vous remercie vraiment beaucoup de votre aide et j'espère que si j'ai encore des questions, vous serez là

    Merci.

Discussions similaires

  1. [XL-2010] Superposition de plusieurs graphes dans un seul
    Par Matrixmax dans le forum Macros et VBA Excel
    Réponses: 13
    Dernier message: 19/02/2013, 18h44
  2. [Débutant] superposition entre plusieurs images
    Par crespo 12 dans le forum Images
    Réponses: 1
    Dernier message: 25/06/2012, 12h57
  3. [AC-2007] [SQL/VBA] Superposition de plusieurs graphiques
    Par Tifriis dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 10/12/2010, 10h19
  4. Réponses: 1
    Dernier message: 09/11/2009, 12h30
  5. Superposer plusieurs containers
    Par jaujau dans le forum Windows Presentation Foundation
    Réponses: 6
    Dernier message: 28/03/2008, 16h27

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