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 :

Une frame ou le panel qu'il contient ne se repaint pas


Sujet :

AWT/Swing Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de RadicalBob
    Profil pro
    Étudiant
    Inscrit en
    Juin 2006
    Messages
    66
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2006
    Messages : 66
    Par défaut Une frame ou le panel qu'il contient ne se repaint pas
    Bonjour a tous et merci de votre attention !

    La situation :

    Dans le carde d'un petit jeu, une frame est suceptible de contenir 4 panel :
    -Celui d'un mini jeu a la spaceinvaders..
    -Celui des ressources du personnage...
    -Celui d'un marché ou acheter des munition etc..
    -Celui d'une sorte de carte ou l'on choisi une planete pour s'y rendre.

    Tous ces panel sont liés par un Joueur qui contient les differentes ressources (munitions, vie, energie etc...)

    Chacun des panneau implements Runnable et lance un petit thread qui se charge de le repaint();

    J'utilise deux methodes qui permettent de mettre ces thread en pause, pour ensuite les relancer.

    Le probleme est :

    Si je lance le jeu en commencant directement par le minijeu (le spaceinvaders) la fenetre s'affiche très bien, pas de soucis. On peut jouer au jeu, la frame s'affiche le panneau se repaint, aucun soucis. A la fin du jeu on accede a la planete désirée (pour l'instant uniquement marchande) puis quand on la quitte on peut choisir une nouvelle planete pour relancer le minijeu. Et là probleme : le jeu ne s'affiche pas, la frame semble etre toujours présente mais est toue grise, pas de jeu. Cependant si on attend le jeu se termine et on retourne au marché et ainsi de suite... mais le jeu ne s'affiche plus.

    Si je lance le jeu en commencant par le marché ou la séléction de la planete le jeu ne s'affiche pas mieux...

    Je met mes source dispos pour que vous puissiez mieux vous en rendre compte : ici

    Je met ici des bouts de codes qui pourraient être suceptible d'en être la cause :

    Le constructeur de la frame :
    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
    public class HFrame extends JFrame implements Runnable{
     
    	private static final long serialVersionUID = 1L;
    	private HRessourcesPanel panelR;
    	private HPanelSystemMap panelS;
    	private HPanelMarchand panelM;
    	private MPanel panelV;
    	private boolean suspendu;
    	private Thread t;
    	private JLabel j1,j2,j3,j4;
     
    	public HFrame (HRessourcesPanel panelR, HPanelSystemMap panelS, HPanelMarchand panelM, MPanel panelV){
     
    		//Assertion indispensables
    		assert (panelR!=null && panelS != null && panelM !=null):"L'un des panneau est nul lors de la frabication de la fenetre";
     
    		//Parametres de la frame
    		this.setTitle("MiniJeu");
    		this.setResizable(false);
    		this.setUndecorated(true);
    		Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
    		this.setSize((int)screenSize.getWidth(), (int)screenSize.getHeight());
    		this.setExtendedState(JFrame.MAXIMIZED_BOTH);
     
    		this.setLayout(new GridBagLayout());
    		this.t=new Thread(this);
    		t.start();
    		suspendu=false;
     
    		//Creation des sous panneaux;
    		this.panelM=panelM;
    		this.panelR=panelR;
    		this.panelS=panelS;
    		this.panelV=panelV;
     
    		//Creation des label combleur de vide
    		j1 = new JLabel();
    		j1.setBackground(Color.RED);
    		j2 = new JLabel();
    		j1.setBackground(Color.BLUE);
    		j3 = new JLabel();
    		j1.setBackground(Color.GREEN);
    		j4 = new JLabel();
    		j1.setBackground(Color.YELLOW);
     
    	}
    Le code qui controle les thread de repaint(), ils sont identiques pour chaque panels :
    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
     
    //Repainter
    	public synchronized void startRepaint(){
    		suspendu=false;
    		notify();
    	}
    	public void stopRepaint(){
    		suspendu=true;
    	}
    	public void run () {
    		try {
    			while (true){
    				this.repaint();
    				Thread.sleep(20);
    				synchronized(this){
    					while(suspendu){
    						wait();
    					}
    				}				
    			}
    		} catch (InterruptedException e) {
    			System.out.println(e);
    		}
    	}
     
    }
    Ici le code qui me permet de vider la frame et d'arreter les thread de repaint()
    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
    	public void stopAllRepaint() {
    		this.panelM.stopRepaint();
    		this.panelS.stopRepaint();
    		this.panelR.stopRepaint();
    		this.panelV.stopRepaint();
    	}
     
    	private void removeComp() {
    		this.remove(panelM);
    		this.remove(panelS);
    		this.remove(panelR);
    		this.remove(panelV);
    		this.remove(j1);
    		this.remove(j2);
    		this.remove(j3);
    		this.remove(j4);
     
    	}
    Et ici les mathodes qui permettent de passer d'une pahse a une autre (minijeu a marché etc...) en montrant tel ou tel panel :

    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
    	public void showVoyage (){
    		this.stopAllRepaint();
    		this.removeComp();
    		GridBagConstraints c = new GridBagConstraints();
    		c.fill = GridBagConstraints.BOTH;
    		c.gridx=0;
    		c.gridy=0;
    		c.gridwidth=1;
    		c.gridheight=1;
    		c.weightx=1;
    		c.weighty=1;
    		this.getContentPane().add(panelV);
    		this.setVisible(true);
    	}
     
    	public void showSystemMap(){
     
    		this.stopAllRepaint();
    		this.removeComp();
     
    		GridBagConstraints c = new GridBagConstraints();
    		c.fill = GridBagConstraints.BOTH;
    		int[] x = {0,1,1,2,3,1};
    		int[] y = {0,0,1,1,1,2};
    		int[] width = {1,3,1,1,1,3};
    		int[] height = {3,1,1,1,1,1};
    		int[] px = {110,690,320,250,320,690};
    		int[] py = {600,175,250,260,250,175};
     
    		Component[] tab = {panelR, j1,j2,panelS,j3,j4};
     
    		for (int i=0;i<6;i++){
    			c.gridx=x[i];
    			c.gridy=y[i];
    			c.gridwidth=width[i];
    			c.gridheight=height[i];
    			c.weightx=px[i];
    			c.weighty=py[i];
    			this.getContentPane().add(tab[i], c);			
    		}
     
    		this.panelS.startRepaint();
    		this.panelR.startRepaint();
    		this.setVisible(true);
     
    	}
     
     
    	public void showMagasin(){
     
    		this.stopAllRepaint();
    		this.removeComp();
     
    		GridBagConstraints c = new GridBagConstraints();
            c.fill = GridBagConstraints.BOTH;
    		int x[]   = {0,1};
        	int y[]   = {0,0};
        	int larg[]= {1,1};
        	int haut[]= {1,1};
        	int px[]  = {1,8};
        	int py[]  = {1,1};
     
        	c.gridx=x[0];
    		c.gridy=y[0];
    		c.gridwidth=larg[0];
    		c.gridheight=haut[0];
    		c.weightx=px[0];
    		c.weighty=py[0];
    		this.getContentPane().add(this.panelR, c);			
     
    		c.gridx=x[1];
    		c.gridy=y[1];
    		c.gridwidth=larg[1];
    		c.gridheight=haut[1];
    		c.weightx=px[1];
    		c.weighty=py[1];		
    		this.getContentPane().add(this.panelM, c);	
     
    		this.panelM.startRepaint();
    		this.panelR.startRepaint();
    		this.setVisible(true);
     
    	}

  2. #2
    Membre confirmé Avatar de RadicalBob
    Profil pro
    Étudiant
    Inscrit en
    Juin 2006
    Messages
    66
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2006
    Messages : 66
    Par défaut
    En fouillant un peu sur le forum j'ai trouvé ce Topic qui à l'air assez proche du miens mais peut être que je me trompe :
    Topic

    Ca parle d'EDT, de Thread etc chose que je ne connais pas du tout, je lis les differents tuto qui sont postés dans le topic, je pense que ça m'aidera.

    Suite à la découverte de ce topic je me pose une nouvelle question :
    La structure de mon jeu n'est surement pas bonne.

    Je rajoute un détail, on va surement me taper sur les doigts mais bon...
    Ce projet est un travail que j'ai a rendre (IUT informatique 1èee année), je vous en supplie aidez moi la je galère vraiment. N'hesitez pas à me poser des questions sur le code etc... je prendrais bien soint de vous répondre

  3. #3
    Membre chevronné Avatar de NeptuS
    Profil pro
    Inscrit en
    Août 2005
    Messages
    392
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2005
    Messages : 392
    Par défaut
    plutot indigeste .... un diagramme UML serait beaucoup plus clair que tout ce merd*** .. tout ce bazar

  4. #4
    Membre confirmé Avatar de RadicalBob
    Profil pro
    Étudiant
    Inscrit en
    Juin 2006
    Messages
    66
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2006
    Messages : 66
    Par défaut
    Je suis bien conscient de ce problème...
    Je vais essayer de faire ca au mieux (mais sous paint )

    Je te donne ça dans quelques minutes.

  5. #5
    Membre chevronné Avatar de NeptuS
    Profil pro
    Inscrit en
    Août 2005
    Messages
    392
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2005
    Messages : 392
    Par défaut
    essaye Excel, c'est plus facile. Ensuite tu prend 1 screenshot

  6. #6
    Membre confirmé Avatar de RadicalBob
    Profil pro
    Étudiant
    Inscrit en
    Juin 2006
    Messages
    66
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2006
    Messages : 66
    Par défaut
    Non c'est bon j'ai quasi fini. En tout cas merci de m'aider quand même malgrés la complexité (enfin le bordel quoi..)

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

Discussions similaires

  1. Comment créer plusieurs Panel dans une Frame
    Par developppez dans le forum Composants
    Réponses: 9
    Dernier message: 02/07/2012, 13h57
  2. Changer completement le contenu d'une frame/panel
    Par pythonneur dans le forum wxPython
    Réponses: 2
    Dernier message: 11/10/2007, 09h29
  3. Afficher des panels dans une frame
    Par doons dans le forum AWT/Swing
    Réponses: 3
    Dernier message: 20/07/2007, 08h07
  4. [wxpython] creer deux panel dans une frame
    Par hysah dans le forum wxPython
    Réponses: 3
    Dernier message: 27/12/2005, 18h21
  5. faire apparaitre et disparaitre un panel dans une frame
    Par Ghost Dog dans le forum Agents de placement/Fenêtres
    Réponses: 5
    Dernier message: 22/04/2005, 01h55

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