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 :

[JTabbedPane] Problème de rafraichissement de l'écran


Sujet :

AWT/Swing Java

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2007
    Messages : 46
    Points : 29
    Points
    29
    Par défaut [JTabbedPane] Problème de rafraichissement de l'écran
    Bonjour,

    je suis en train de construire le jeu Othello-Reversi en Java.
    Au début, mon jeu était constitué d'une simple fenêtre (contenant uniquement l'échiquier), mais je viens d'ajouter des onglets et l'échiquier du jeu se trouve maintenant dans l'un de ces onglets.
    Seulement, depuis que j'ai "glissé" le jeu dans cet onglet, j'ai des problèmes de rafraichissement d'écran.

    dans ma classe "OngletJeu", j'ai une méthode miseAJour qui modifie des champs (nbre de pions, temps,...) et mon échiquier (un JPanel).

    Lorsque je démarre mon jeu, et que je lance une Nouvelle Partie, mon échiquier n'est pas "actualisé". Pour voir son actualisation, 2 possiblités
    -> je clique sur un autre onglet puis je reviens
    -> je déplace la fenêtre hors de l'écran puis je la ramène

    En ce qui concerne les champs, c'est pire, rien ne s'actualise, même avec ces 2 astuces.

    Et pourtant, avant que je n'essaye d'ajouter ces onglets, tout fonctionnait à merveille.

    Je me demandais si par hasard il ne faudrait pas une sorte d' "autorisation" afin que le contenu d'un onglet puisse être mis à jour... J'ai vraiment essayé plein de trucs mais je ne m'en sors pas.

    Si vous pouviez m'aider, ce sera très gentil

    Voici le code de ma classe ongletJeu :

    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
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
     
    package ihm;
     
    import logique.Echiquier;
    import logique.Actualisation;
    import logique.Constantes;
    import logique.Partie;
     
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    import logique.Logique;
    import java.util.Date;
     
    import java.awt.BorderLayout;
    import java.awt.Container;
    import java.awt.GridBagConstraints;
    import java.awt.GridBagLayout;
    import java.awt.GridLayout;
    import javax.swing.ButtonGroup;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JMenu;
    import javax.swing.JMenuBar;
    import javax.swing.JMenuItem;
    import javax.swing.JOptionPane;
    import javax.swing.JPanel;
    import javax.swing.JRadioButtonMenuItem;
     
    public class OngletJeu extends JPanel implements Actualisation {
     
    	private Echiquier echiquier; // L'échiquier du jeu
     
    	private Panneau panneau; // Surface visible de l'échiquier
     
    	private ImgPion imgPion; // image du pion vide
     
    	private Partie partie; // la partie
     
    	private JPanel infos;
     
    	private JPanel jpanelPanneau;
     
    	private JLabel nbrNoir; // nombre de pions noirs
     
    	private JLabel nbrBlanc; // nombre de pions blancs
     
    	private JLabel difference; // nombre de pions blancs
     
    	/** A qui c'est le tour */
     
    	private JLabel tpsEcoule;
     
     
    		/* Constructeur de fenêtre */
    	public OngletJeu(Echiquier echiquier, Partie partie) {
    		super(false);	
     
    		this.echiquier = echiquier;
    		this.partie = partie;		
    		this.imgPion = new ImgPion(partie);
    		this.panneau = new Panneau(echiquier);
    		this.infos = panelInfos();
    		this.jpanelPanneau = panelPanneau();
     
    		setLayout(new GridLayout(1,2));
    		setLayout(new BorderLayout());
     
    		add(infos, BorderLayout.EAST);
    		add(jpanelPanneau, BorderLayout.CENTER);
     
    		EcouteurSouris ecouteurSouris = new EcouteurSouris(this, Ihm.logiqueIhm.donnePartie());
    		this.donnePanneau().addMouseListener(ecouteurSouris);
    		Ihm.logiqueIhm.donnePartie().determineActualisation(this);		
    	}
     
    	/* permet de connaitre le panneau d'affichage */
    	public Panneau donnePanneau() {
    		return this.panneau;
    	}
     
    	private JPanel panelPanneau() {
    		JPanel tmp = new JPanel();
    		tmp.setLayout(new GridLayout(1, 1));	
    		tmp.add(panneau);
    		return tmp;
    	}
     
    	/* Le panneau d'informations */
    	private JPanel panelInfos() {
    		JPanel tmp = new JPanel();
    		// Les layouts
    		// tmp.setLayout(new GridLayout(1, 8));
    		tmp.setLayout(new GridLayout(8, 1));
    		// Création des composants
     
    		this.nbrNoir = new JLabel("Pions Noirs :        --");
    		this.nbrBlanc = new JLabel("Pions Blancs :     --");
    		this.difference = new JLabel("Différence :    --");
    		JLabel aQuiLeTour = new JLabel("-- JOUEUR ACTUEL --");
    		JLabel temps = new JLabel("--        TEMPS        --");
    		this.tpsEcoule = new JLabel("            0  :  0");
     
    		// Ajout des composants
     
    		tmp.add(aQuiLeTour);
    		tmp.add(imgPion);
    		tmp.add(nbrNoir);
    		tmp.add(nbrBlanc);
    		tmp.add(difference);
    		tmp.add(temps);
    		tmp.add(tpsEcoule);
     
    		return tmp;
    	}
     
    	/* Mise à jour de la fenêtre */	
    	public void miseAJour() {
    		// Mise à jour des differents composants graphique
     
    		this.panneau.repaint();
    		this.imgPion.repaint();
     
    		Integer nbN = new Integer(echiquier.donneNbPions(Constantes.NOIR));
    		Integer nbB = new Integer(echiquier.donneNbPions(Constantes.BLANC));
    		Integer diff = new Integer(nbB.intValue() - nbN.intValue());
     
    		System.out.println("***Je suis dans miseAJour()***");
    		this.nbrNoir.setText("Pions Noirs :        ".concat(nbN.toString()));
    		this.nbrBlanc.setText("Pions Blancs :     ".concat(nbB.toString()));
     
    		if (diff.intValue() > 0)
    			this.difference.setText("Différence :    ".concat(diff.toString()));
    		else
    			this.difference.setText("Différence :    ".concat((new Integer(-(diff.intValue()))).toString()));
     
    		//affichage du temps
     
    		Date deb = partie.donneDebutPartie();
    		Date fin = new Date();
    		float ecart = fin.getTime() - deb.getTime();
    		float ecartSec = ecart / 1000/* .0f */;
    		float nbSec;
    		float nbMin = 0;
    		if (ecartSec < 60) {
    			nbSec = ecartSec;
    		} else {
    			nbSec = ecartSec % 60;
    			nbMin = (ecartSec - nbSec) / 60;
    		}
    		Float fMin = new Float(nbMin);
    		Float fSec = new Float(nbSec);
     
    		String Stps = "            ".concat(new Integer(fMin.intValue())
    				.toString().concat("  :  ").concat(
    						new Integer(fSec.intValue()).toString()));
    		this.tpsEcoule.setText(Stps);
    		System.out.println("@@@ ECRIT LE TEMPS @@@");
     
    		// On va peut être afficher un message
    		if (partie.estBloque()) {
    			partie.stopTemps();
    			JOptionPane.showMessageDialog(this, "Partie bloquée", "Fin",
    					JOptionPane.INFORMATION_MESSAGE);
    		} else {
    			if (!partie.enCours()) {
    				partie.stopTemps();
    				if (echiquier.donneNbPions(Constantes.NOIR) > echiquier
    						.donneNbPions(Constantes.BLANC)) {
    					JOptionPane.showMessageDialog(this, "NOIR gagne", "Fin",
    							JOptionPane.INFORMATION_MESSAGE);
    				} else {
    					if (echiquier.donneNbPions(Constantes.NOIR) < echiquier
    							.donneNbPions(Constantes.BLANC)) {
    						JOptionPane.showMessageDialog(this, "BLANC gagne",
    								"Fin", JOptionPane.INFORMATION_MESSAGE);
    					} else {
    						JOptionPane.showMessageDialog(this, "Partie nulle",
    								"Fin", JOptionPane.INFORMATION_MESSAGE);
    					}
    				}
    			}
    		}
    	}
     
    }

    Et voici le code de la classe Fenetre qui contient les différents onglets...


    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
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
     
     
    package ihm;
     
    import java.awt.Dimension;
    import java.awt.event.KeyEvent;
    import logique.*;
     
    import javax.swing.*;
    import java.awt.*;
     
    import logique.Echiquier;
    import logique.Actualisation;
    import logique.Constantes;
    import logique.Logique;
    import logique.Partie;
     
    import java.util.Date;
     
    import java.awt.BorderLayout;
    import java.awt.Container;
    import java.awt.GridLayout;
    import javax.swing.ButtonGroup;
    import javax.swing.ImageIcon;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JMenu;
    import javax.swing.JMenuBar;
    import javax.swing.JMenuItem;
    import javax.swing.JOptionPane;
    import javax.swing.JPanel;
    import javax.swing.JRadioButtonMenuItem;
    import javax.swing.JTabbedPane;
    import javax.swing.SwingConstants;
     
     
     
    public class Fenetre extends JFrame {
     
    	/** Le container d'affichage */
    	private Container container;
     
    	//JPanel ongletJeu;
     
    	OngletJeu ongletJeu2;
     
    	/** Nouvelle partie */
    	public JMenuItem nouvellePartie;
     
    	/** Quitter */
    	public JMenuItem quitter;
     
    	public JRadioButtonMenuItem hVSh;
     
    	public JRadioButtonMenuItem cVSc;
     
    	public JRadioButtonMenuItem cnVShb;
     
    	public JRadioButtonMenuItem cbVShn;
     
    	public JRadioButtonMenuItem facile;
     
    	public JRadioButtonMenuItem moyen;
     
    	public JRadioButtonMenuItem difficile;
     
    	public JRadioButtonMenuItem avance;
     
    	public JRadioButtonMenuItem expert;
     
    	private Echiquier echiquier; // L'échiquier du jeu
     
    	private Partie partie; // la partie
     
    	private Logique logique;
     
    	JTabbedPane onglets;
     
    	/* Constructeur de fenêtre */
    	public Fenetre(Echiquier echiquier, Partie partie) {
     
    		super("Othello-Reversi par CALANDE Stéphane & FABER Paul");
    		this.echiquier = echiquier;
    		this.partie = partie;
    		this.miseEnPage();
    		this.setResizable(false);
    		//this.setBounds(100, 100, 770, 695);
    		this.setBounds(0, 0, 1000, 1000);
    		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		this.setVisible(true);		
     
    		//JPanel ongletJeu = new OngletJeu(echiquier,partie);
    		ongletJeu2 = new OngletJeu(echiquier,partie);
     
    		//ongletJeu = new OngletJeu(logique.donneEchiquier(), logique.donnePartie());
     
    		EcouteurSouris ecouteurSouris = new EcouteurSouris(ongletJeu2, partie);
     
    		ongletJeu2.donnePanneau().addMouseListener(ecouteurSouris);
    		partie.determineActualisation(ongletJeu2);
     
     
    	}
     
    	/**
             * Pour faire la mise en page de la fenêtre
             * 
             */
    	private void miseEnPage() {
     
    		// Créations des composants
     
    		JPanel pannel = new JPanel();
    		pannel.setBackground(Color.RED);		
    		onglets = new JTabbedPane(SwingConstants.TOP);
    		JPanel ongletJeu = new OngletJeu(echiquier,partie);
    		onglets.addTab("Jeu",ongletJeu);
    		onglets.setPreferredSize(new Dimension(910, 910));
    		JPanel onglet2 = new JPanel();
    		onglet2.add(new JLabel("Onglet 2"));
    		onglets.addTab("onglet2", onglet2);
    		JPanel onglet3 = new JPanel();
    		onglet3.add(new JLabel("Onglet 3"));
    		onglets.addTab("onglet3", onglet3);
     
    		onglets.setVisible(true);
    		onglets.setOpaque(true);
    		pannel.add(onglets);
    		getContentPane().add(pannel);
    		setVisible(true);
    		setJMenuBar(menu());
    		pack();	
     
    	}
     
    	/**
             * Crée le menu
             * 
             */
    	private JMenuBar menu() {
    		// Création
    		JMenuBar tmp = new JMenuBar();
    		JMenu menuJeu = new JMenu("Jeu");
    		// JMenu menuInfos = new JMenu("?");
    		JMenu ordinateur = new JMenu("Ordinateur");
    		JMenu difficulte = new JMenu("Difficulté");
    		nouvellePartie = new JMenuItem("Nouvelle partie");
    		quitter = new JMenuItem("Quitter");
     
    		ButtonGroup grpCouleur = new ButtonGroup();
    		hVSh = new JRadioButtonMenuItem("Humain contre Humain");
    		cVSc = new JRadioButtonMenuItem("Ordinateur contre Ordinateur");
    		cnVShb = new JRadioButtonMenuItem(
    				"Humain (blanc) contre Ordinateur (noir)");
    		cbVShn = new JRadioButtonMenuItem(
    				"Humain (noir) contre Ordinateur (blanc)");
     
    		grpCouleur.add(hVSh);
    		grpCouleur.add(cVSc);
    		grpCouleur.add(cnVShb);
    		grpCouleur.add(cbVShn);
     
    		ordinateur.add(cbVShn);
    		ordinateur.add(cnVShb);
    		ordinateur.add(hVSh);
    		ordinateur.add(cVSc);
     
    		ButtonGroup grpDifficulte = new ButtonGroup();
    		facile = new JRadioButtonMenuItem("Facile");
    		moyen = new JRadioButtonMenuItem("Moyen");
    		difficile = new JRadioButtonMenuItem("Difficile");
    		avance = new JRadioButtonMenuItem("Avancé");
    		expert = new JRadioButtonMenuItem("Expert");
     
    		difficulte.add(facile);
    		difficulte.add(moyen);
    		difficulte.add(difficile);
    		difficulte.add(avance);
    		difficulte.add(expert);
     
    		grpDifficulte.add(facile);
    		grpDifficulte.add(moyen);
    		grpDifficulte.add(difficile);
    		grpDifficulte.add(avance);
    		grpDifficulte.add(expert);
     
    		moyen.setSelected(true);
    		// Ajout Item à menu
    		menuJeu.add(nouvellePartie);
    		menuJeu.addSeparator();
    		menuJeu.add(difficulte);
    		menuJeu.addSeparator();
    		menuJeu.add(ordinateur);
    		menuJeu.addSeparator();
    		menuJeu.add(quitter);
     
    		// Ajout menus à barre menu
    		tmp.add(menuJeu);		
    		cbVShn.setSelected(true);
    		return tmp;
    	}
    }

    Encore merci...

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    504
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 504
    Points : 288
    Points
    288
    Par défaut
    on dirait que ta méthode Mise à jour() n'est pas appelé, et d'ailleur dans le code tu l'appel ou ? est tu sur de passer à l'interieur ?
    mais un System.out.println("aaaaaaa"); pour vérifier

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2007
    Messages : 46
    Points : 29
    Points
    29
    Par défaut
    Si si, la méthode miseAJour est appelée, mais dans d'autres classes qui s'occupent de la gestion 'interne' du jeu.

    A titre d'exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public void incrementeTemps() {
        timer = new Timer();
        TimerTask tache = new TimerTask() {
        	  public void run() {    		  
        		  System.out.println("coucou");
        		  actualisation.miseAJour();
        	  }
        	};
        timer.scheduleAtFixedRate(tache, 0, 1000);
    }
    et...

    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
     
     
    	/* Pour commencer un nouvelle partie */
    	public void nouvelle() {
    		this.debutPartie = new Date();
    		this.enCours = true;
    		this.bloque = false;
    		this.joueurActuel = joueurNoir;
    		this.echiquier.initialise();
    		this.actualisation.miseAJour();
    		this.actualisation.miseAJour2();
    // ici
    		incrementeTemps();
     
    		if (this.joueurActuel.donneType() == Constantes.IA) {
    			ia.jouer(this.joueurActuel);
    		}
    	}

    et "coucou" s'affiche

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    504
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 504
    Points : 288
    Points
    288
    Par défaut
    bah alors je sais plus trop... en plus je viens de voir tu avais deja mis un System.out.println("***Je suis dans miseAJour()***");, donc ma reponse ne servait à rien
    lol
    peut etre tu peux rajouter un ton tabbedPane.validate() dans ta méthode mise à jours.. mais ca m'etonnerais...
    genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    getParentComponent().validate(); // je ne suis pas sure du nom de la méthode mais cela doit etre un truc comme ca...

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2007
    Messages : 46
    Points : 29
    Points
    29
    Par défaut
    Merci bcp pour ta réponse, mais ça n'a pas l'air de changer qqch

    Le problème c'est qu'il passe vraiment aux bons moments dans miseAJour, il exécute des setText, des repaint,... mais à l'écran rien ne bouge dans mon onglet

  6. #6
    Membre averti
    Inscrit en
    Janvier 2006
    Messages
    257
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 257
    Points : 308
    Points
    308
    Par défaut
    j'ai deja eu se genre de soucis cela fait longtemps je crois que j'avais resolu en mettant des super.repaint(). Il ne m'a pas sembler en voir dans ton code.

    D'autre part verifie bien que tu ne bloque pas l'EDT avec une boucle while() si jamais c'est le cas pense a faire un thread a part par rapport a l'affichage de la classe qui gère les OS de ton jeu

    J'espere avoir été un peu clair

    ++

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2007
    Messages : 46
    Points : 29
    Points
    29
    Par défaut Stop :-)
    Ouffff j'ai enfin trouvé, je me cassais la tête dessus depuis hier...

    Pas évident de vous expliquer sans rentrer dans les détails, mais on va dire que c'est une erreur de "duplication de code", suite aux nombreux 'chipotages' que j'ai fait dans mon code pour tenter de résoudre l'ensemble des bugs rencontrés suite à cet insertion dans un onglet...


    Merci à tous !

Discussions similaires

  1. Réponses: 4
    Dernier message: 31/01/2012, 14h56
  2. Problème de rafraichissement d'écran
    Par Chercheur dans le forum MFC
    Réponses: 2
    Dernier message: 26/09/2005, 22h35
  3. [SWING] Problème de rafraichissement
    Par david71 dans le forum AWT/Swing
    Réponses: 3
    Dernier message: 24/05/2004, 15h38
  4. [JTree]problème de rafraichissement
    Par peppena dans le forum Composants
    Réponses: 9
    Dernier message: 20/01/2004, 14h06
  5. Toujours un problème de rafraichissement de DBGrid
    Par tripper.dim dans le forum C++Builder
    Réponses: 4
    Dernier message: 09/12/2002, 13h15

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