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 :

[AWT]Changement de panel dans un panel


Sujet :

AWT/Swing Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Avatar de guipom
    Inscrit en
    Janvier 2003
    Messages
    207
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 207
    Par défaut [AWT]Changement de panel dans un panel
    Bonjour,

    je voudrais faire une opération fort simple mais qui me complique la vie car ne fonctionne pas.

    J'arrive sans problème à supprimer un component du panel courant, et le remplacer par un autre (opérations remove et add). Ca ne pose donc pas de problème.

    Je voudrais faire quelque chose de plus compliqué, j'ai une fenêtre donc qui contiendrait deux panels, un de sélection, l'autre d'affichage, et je voudrais donc non plus modifier le contenu du panel courant, mais celui du panel d'affichage. Facile me direz vous ! oui mais ca ne fonctionne pas, et je ne vois pas pourquoi.

    J'ai fait un exemple aussi simple que possible ne fonctionnant pas pour vous expliquer le problème, ce code ce trouve dans le constructeur de d'une frame, MyPanel est un classe qui dérive de Panel et que ne fait que définir le getPreferredSize entre autres.

    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
    MyPanel panel = new MyPanel (640,480);
    		panel.setBackground(Color.WHITE);
    		MyPanel panelb = new MyPanel (640,480);
    		panelb.setBackground(Color.BLUE);
    		MyPanel panelr = new MyPanel (640,480);
    		panelr.setBackground(Color.RED);
    		MyPanel panelv = new MyPanel (640,480);
    		panelv.setBackground(Color.GREEN);
     
    		add(panel);
     
    		panel.add(panelb);
     
    		pack();
    		setLocationRelativeTo(getParent());
    		setVisible(true);
    		show();
     
    		try {
    			Thread.sleep(1000);
    			System.out.println("on passe au rouge");
    			panel.remove(panelb);
    			panel.add(panelr);
    		}
    		catch (Exception e) {}
     
    		try {
    			Thread.sleep(1000);
    			System.out.println("on passe au vert");
    			panel.remove(panelr);
    			panel.add(panelv);
    		}
    		catch (Exception e) {}
    donc logiquement, toutes les 1 secondes, je devrais voir un panel bleu, puis un rouge, puis un vert. Hors je ne vois qu'un panel rouge, puis il s'en va, et je vois donc le fond de mon panel d'affichage (ici blanc) et c'est tout.

    Le texte s'affiche bien toutes les 1 secondes, mais c'est tout.

    Qu'est ce qu'il manque pour que ca marche ? Je ne vois plus du tout, ca me parait tellement évident que ca devrait marcher que je dois passer à coté de quelque chose !

    merci d'avance







    [Modéré par Didier]
    Ajout de tag dans le titre
    Lire les règles du forum : Règles du forum Java

  2. #2
    Membre confirmé
    Avatar de guipom
    Inscrit en
    Janvier 2003
    Messages
    207
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 207
    Par défaut
    j'ai trouvé une solution qui consiste à appeller un pack() sur mon objet frame, celui qui contient les deux panel donc, mais meme si ca fonctionne, je me demande si c'est la bonne solution ? que fait ce pack exactement, et n'y a t'il pas une méthode plus précise à appeller uniquement sur le panel concerné ?

  3. #3
    Membre chevronné

    Développeur Web
    Inscrit en
    Mars 2002
    Messages
    412
    Détails du profil
    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2002
    Messages : 412
    Par défaut
    Salut, je pense que ton problème est un problème de thread : toutes les opérations graphiques que tu demandes à la jvm sont normalement différées à la fin de ton traitement. Autrement dit, tu devrais peut-être créer un thread qui fait ton travail de modif d'affichage.

    Par contre du coup attention : si, parmi les composants que tu affiches, certains génèrent des évènements qui modifient aussi l'affichage, alors tu dois gérer les accès concurrents (simultanés) aux composants affichés. Parce que les évènements s'exécutent sur le thread principal, qui sera donc en concurrence avec ton travail de modif d'affichage.

  4. #4
    Membre confirmé
    Avatar de guipom
    Inscrit en
    Janvier 2003
    Messages
    207
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 207
    Par défaut
    si je te dis que malgré avoir relu plusieurs fois j'ai pas tout compris, tu me crois ?

    donc je vois ce que tu veux m'expliquer, le premier affichage se fait ok, ensuite j'arrive encore à faire un remove du panel, la encore ca marche, et ca bloque quand je fais le add, c'est parce que le thread attend quelque chose pour finir et afficher ? ca serait pas justement ce pack, ou une méthode que pack appelle ?

    parce que bon créer un thread pour faire changer le panel contenu dans un panel par clic sur un bouton, je trouve ca un peu excessif non ?

  5. #5
    Membre averti
    Inscrit en
    Mai 2002
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 47
    Par défaut
    pour redessiner ton panel il faut appeler la methode repaint()

    et cette methode ( celle la ou celle appelée paint() je ne sais pas) doit etre utilisée par la methode pack() qui elle sert a adapter la taille d'un panel a la taille de ses composants.

    source : http://www.lifl.fr/~routier/enseigne...p/introIHM.pdf

  6. #6
    Membre chevronné

    Développeur Web
    Inscrit en
    Mars 2002
    Messages
    412
    Détails du profil
    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2002
    Messages : 412
    Par défaut
    Citation Envoyé par guipom
    parce que bon créer un thread pour faire changer le panel contenu dans un panel par clic sur un bouton, je trouve ca un peu excessif non ?
    ah non effectivement c'est pas une bonne idée. Je pensais que tu voulais un traitement qui change tes couleurs toutes les secondes.

  7. #7
    Membre confirmé
    Avatar de guipom
    Inscrit en
    Janvier 2003
    Messages
    207
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 207
    Par défaut
    désolé en effet si je me suis mal fait comprendre, non j'ai juste donné un petit exemple pour illustrer mon problème

    regis1_1 -> deja fait repaint, c'est la première chose que j'ai essayée, et y a que pack qui m'a fait le dessin à nouveau

  8. #8
    Membre averti
    Inscrit en
    Mai 2002
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 47
    Par défaut
    Causes this Window to be sized to fit the preferred size and layouts of its subcomponents. If the window and/or its owner are not yet displayable, both are made displayable before calculating the preferred size. The Window will be validated after the preferredSize is calculated

    source : http://java.sun.com/j2se/1.5.0/docs/...ow.html#pack()

    en clair pack() redefini la taille de la fenetre d'apres la taille de ses souscomposants. si la fenetre et ou les fenetres parentes ne sont pas visibles on les defini a visible avant de calculer la taille preferée [la ca nous interesse] et ensuite on valide la fenetre [? est-ce utile? --> a tester si le fait de mettre les fentres a visible ne fonctionne pas]

    edit :
    public void validate()
    Validates this container and all of its subcomponents.
    The validate method is used to cause a container to lay out its subcomponents again. It should be invoked when this container's subcomponents are modified (added to or removed from the container, or layout-related information changed) after the container has been displayed.



    bon a noter que je nai rien testé mais en suivant le descriptif de pack() la seule chose dont tu n'as pas besoin( et qui pourrait etre genant si tu redefini la taille de la fenetre) c'est le fait quelle redefini la taille de la fenetre... don il faudrait que tu fasse une methode qui te permette de mettre a visible toutes les fenetres parentes (de facon recursive par exemple avec un .visible(true)) si ca ne suffit pas ajouter aussi un .validate()

    source : http://java.sun.com/j2se/1.5.0/docs/...tml#validate()

    donc le validate est utile mais doit etre fait sur tous les parents de maniere recursive ... donc avec un validateTree() [expliqué juste en dessous du lien precedant]

  9. #9
    Membre confirmé
    Avatar de guipom
    Inscrit en
    Janvier 2003
    Messages
    207
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 207
    Par défaut
    ok merci je vais essayer ca et je vous tiens au courant

  10. #10
    Membre confirmé
    Avatar de guipom
    Inscrit en
    Janvier 2003
    Messages
    207
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 207
    Par défaut
    ces informations sont tout a fait justes, un validate du panel cible a suffit dans mon cas, du moins le validateTree fonctionne aussi mais ne fait rien de plus évidemment, et j'économise le pack donc

    merci beaucoup

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

Discussions similaires

  1. Changement de title dans un panel
    Par abraxis dans le forum Ext JS / Sencha
    Réponses: 4
    Dernier message: 18/01/2011, 16h20
  2. Affichage de panel dans un panel
    Par Invité dans le forum Agents de placement/Fenêtres
    Réponses: 8
    Dernier message: 10/12/2008, 10h57
  3. Problème taille de cellule d'un panel dans un panel
    Par zuzuu dans le forum Agents de placement/Fenêtres
    Réponses: 4
    Dernier message: 10/09/2008, 11h39
  4. Problème taille d'un panel dans un panel dans un panel.
    Par zuzuu dans le forum Agents de placement/Fenêtres
    Réponses: 3
    Dernier message: 05/08/2008, 10h19
  5. [VB.NET] image d'un bouton dans un panel dans une fentre MDI
    Par smedini dans le forum Windows Forms
    Réponses: 6
    Dernier message: 02/02/2006, 18h15

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