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 :

[DoubleBuffering][JMenu] menu non afficher


Sujet :

AWT/Swing Java

  1. #1
    Membre habitué
    Homme Profil pro
    Ingénieur Informatique
    Inscrit en
    Décembre 2005
    Messages
    146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur Informatique

    Informations forums :
    Inscription : Décembre 2005
    Messages : 146
    Points : 158
    Points
    158
    Par défaut [Resolu][DoubleBuffering][JMenu] menu non afficher
    Bonjour

    J'ai utilise pour l'affichage la technique du doublebuffering hardware comme vous le montrer dans la faq java. Seulement, quand j'utilise un JMenu pour affiche le menu de la fenetre... Et bien ce dernier ne s'affiche pas.
    Par contre si j'utilise une Frame, j'ai n'ai aucun soucis un MenuBar s'affiche bien :s

    Seulement j'ai besoin du composant JCheckBoxMenuItem et de ce qui lui ai associé. Bref obligé d'utiliser swing à ma connaissance pour ça...
    Donc si vous saviez d'où pouvait venir l'erreur se serait gentil de me l'indiquer ^^
    voici un bout de code d'ou l'erreur pourrait venir si c'est bien sur le code ou se trouve l'erreur :s

    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
    		setTitle("Editeur de cartes");
    		setIconImage(Toolkit.getDefaultToolkit().getImage(
    				getClass().getResource("/editeur/ressources/Icone.png")));
    		setBounds(new Rectangle(250, 50, 1000, 1000));
    		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		setVisible(true);
    		// inhibe la méthode courante d'affichage du composant
    		setIgnoreRepaint(true);
    		// on créé 2 buffers dans la VRAM donc c'est du double-buffering
    		createBufferStrategy(2);
    		// récupère les buffers graphiques dans la mémoire VRAM
    		strategy = getBufferStrategy();
    		buffer = strategy.getDrawGraphics();
    		renderingThread.start();
     
     
    		menu = new JMenuBar();
    		fichier = new JMenu("Fichier");
    		nouveau = new JMenuItem("Nouveau");
    		quitter = new JMenuItem("Quitter");
     
    		menu.add(fichier);
    		fichier.add(nouveau);
    		fichier.add(quitter);
     
    		/*
    		vueDessus = new JCheckBoxMenuItem("Vue de dessus");
    		vueIso = new JCheckBoxMenuItem("Vue isométrique");
    		*/
     
    		setJMenuBar(menu);

  2. #2
    Gfx
    Gfx est déconnecté
    Expert éminent
    Avatar de Gfx
    Inscrit en
    Mai 2005
    Messages
    1 770
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Points : 8 178
    Points
    8 178
    Par défaut
    L'erreur est la suivant : n'utilise pas de double buffering, laisse faire Swing (qui est DEJA double bufferise).

  3. #3
    Membre habitué
    Homme Profil pro
    Ingénieur Informatique
    Inscrit en
    Décembre 2005
    Messages
    146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur Informatique

    Informations forums :
    Inscription : Décembre 2005
    Messages : 146
    Points : 158
    Points
    158
    Par défaut
    Bon, je viens de changer ... J'utilise donc la méthode paint et ds les évenement je fais un repaint.
    Effectivement je n'ai pas de clipping. Mais mon problème reste identique :s
    mon image que j'applique sur la fenetre cache le jmenu :s et ce quoi que je fasse. J'ai meme tenter, en décalant le dessin de l'image plus en bas... Mais il n'en a que faire

    Pour arriver à mes fins j'ai du rajouter dans la gestion d'évenement en plus la méthode
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    paintComponents(this.getGraphics())
    pour forcer le dessin du menu...
    Mais de cette maniére j'ai l'effet du clipping :s

    Bref je tourne en rond dans l'histoire

    EDIT:

    En fait, c'est soit affichage de l'image... Soit affichage des composant plus "classique" de swing. Enfin c'est l'idée qui m'en vient aprés les différents tests que j'ai fait.
    voivi la méthode pour gérer l'evenement :
    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
    	public void keyPressed(KeyEvent evt) {
    		int t = evt.getKeyCode();
     
     
    		switch(t) {
    		case KeyEvent.VK_DOWN:
    			if(cur_y >= HAUTEUR_CARTE)
    				cur_y = 0;
    			else
    				cur_y = cur_y+Terrain.TAILLE_LARGEUR_TERRAIN; // on se déplace d'une case (taille de la case)
    			break;
    		case KeyEvent.VK_LEFT:
    			if(cur_x <=0)
    				cur_x = LARGEUR_CARTE;
    			else
    				cur_x = cur_x-Terrain.TAILLE_LARGEUR_TERRAIN; 
    			break;
    		case KeyEvent.VK_UP:
    			if(cur_y <=0)
    				cur_y = LARGEUR_CARTE;
    			else
    				cur_y = cur_y - Terrain.TAILLE_LARGEUR_TERRAIN;
    			break;
    		case KeyEvent.VK_RIGHT:
    			if(x>=LARGEUR_CARTE)
    				cur_x = 0;
    			else
    				cur_x = cur_x + Terrain.TAILLE_LARGEUR_TERRAIN;
    			break;			
    		}
    		repaint();
    	}
    qui est somme toute trés classique

    et voici ma méthode paint :
    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
    	public void paint(Graphics g) {
     
    		Graphics2D buffer = (Graphics2D)g;
    		if (initialisation) {
    			buffer.setColor(Color.black);
    			buffer.fillRect(0, 0, 990, 990);
    			buffer.setColor(Color.white);
    			buffer.drawString("Chargement en cours... veuillez patienter merci!", x, 200);
    			x++;
    			if (x > 990)
    				x = 0;
    			// on envoie toutes les données du buffer mémoire vers le buffer
    			// d'affichage
    			//strategy.show();
    		} else {
    			// on utilise le terrain de base pour affiche un terrain d'une
    			// taille par defaut! le premier de la liste
    			ITerrain terrain = generateurTerrain.obtenirSpriteTerrain(0);
    			/*
    			buffer.setColor(Color.black);
    			buffer.fillRect(0, 0, LARGEUR_CARTE, HAUTEUR_CARTE);
    			buffer.setColor(Color.white);
    			*/
    			for (int i = 0; i < LARGEUR_CARTE / Terrain.TAILLE_LARGEUR_TERRAIN; i++)
    				for (int j = 0; j < HAUTEUR_CARTE
    						/ Terrain.TAILLE_LARGEUR_TERRAIN; j++)
    					buffer.drawImage(terrain.obtenirImage(), i * 90, j * 90,
    							null);
    			Color c = buffer.getColor();
    			buffer.setColor(Color.red);
    			//buffer.draw3DRect(oldCur_x,oldCur_y,Terrain.TAILLE_LARGEUR_TERRAIN,Terrain.TAILLE_LARGEUR_TERRAIN,false);
    			// affichage nouvelle position
    			buffer.draw3DRect(cur_x,cur_y,Terrain.TAILLE_LARGEUR_TERRAIN,Terrain.TAILLE_LARGEUR_TERRAIN,false);
    			buffer.setColor(c);
    			//affichageCurseur();
    			//strategy.show();
    		}
    		paintComponents(g);
     
    	}
    si je ne met pas j'ai mon image afficher normalement. tandis que si je le met mon menu s'affiche, l'image n'apparait que trés rapidement lors d'un clic sur les touches du clavier :s

    Bref si vous avez une idée d'où peut venir le problème

  4. #4
    Membre habitué
    Homme Profil pro
    Ingénieur Informatique
    Inscrit en
    Décembre 2005
    Messages
    146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur Informatique

    Informations forums :
    Inscription : Décembre 2005
    Messages : 146
    Points : 158
    Points
    158
    Par défaut
    Et bien je me demande pourquoi je n'y pas pensé plutot ^^.
    Initialement avant d'utiliser le DoubleBuffering je voulais faire une fenetre et ajouter un panneau qui s'occuperait à proprement parler de l'affichage des image.
    En soit quelque chose de plus propre. Mais la méthode createBufferStrategy n'est pas visible depuis un JPanel. d'où ma lutte avec le jframe pour arrive à afficher menu et image
    Mais vu que le doublebuffering est déjà gérer avec swing... Je peux me passer de cela.
    Et revenir à ma conception initiale. Et naturellement cela fonctionne honorablement...

    Par contre j'ai une autre question qui reste en suspens! J'ai du mal à comprendre pourquoi tant de monde conseil d'utilise le doublebuffering alors que c'est déjà implémenter :s est-ce que c'est juste implémenter sur les jvm récente?

    Enfin bref, tout est bien qui fini bien quand même

  5. #5
    Membre confirmé
    Avatar de Glob
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Avril 2002
    Messages
    428
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Avril 2002
    Messages : 428
    Points : 630
    Points
    630
    Par défaut
    Hello.

    Le double buffering peut être sympathique si tu fais du rendu actif.

    Si tu veux faire un jeu, il peut être utile de contrôler quand se fait le swapBuffer...

  6. #6
    Membre habitué
    Homme Profil pro
    Ingénieur Informatique
    Inscrit en
    Décembre 2005
    Messages
    146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur Informatique

    Informations forums :
    Inscription : Décembre 2005
    Messages : 146
    Points : 158
    Points
    158
    Par défaut
    Etant donnée que c'est un jeu. Effectivement cela peut aider...
    Dans l'immédiat non. Mais dans un avenir plus ou moins proche je vais en avoir besoin :s. Je pense notament au mode multi-joueur. la synchronisation peut surrement être plus facile avec ce genre de control à vue de nez.

    Et la ben, je resterais coincé . Ici pas génant, car ce n'est qu'un simple éditeur...
    Donc si quelqu'un a une idée pour me permettre de rester avec le doublebuffering :p. Cela me dépannerait qd même beaucoup

  7. #7
    Gfx
    Gfx est déconnecté
    Expert éminent
    Avatar de Gfx
    Inscrit en
    Mai 2005
    Messages
    1 770
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Points : 8 178
    Points
    8 178
    Par défaut
    N'utilise pas le double buffering tant qu'il n'est pas utile, c'est tout.

  8. #8
    Membre confirmé
    Avatar de Glob
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Avril 2002
    Messages
    428
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Avril 2002
    Messages : 428
    Points : 630
    Points
    630
    Par défaut
    Mmmhh... je sais pas si double buffering + rendu actif fait bon ménage avec les bidules Swing (menus, boutons, ...). Peut-être faut-il faire repeindre à la main les enfants de ton JFrame, juste avant le swapBuffer (ou juste après, je sais pas, à voir)

    EDIT: j'espère que Gfx n'est pas offusqué par l'utilisation du terme "bidule" Swing

  9. #9
    Gfx
    Gfx est déconnecté
    Expert éminent
    Avatar de Gfx
    Inscrit en
    Mai 2005
    Messages
    1 770
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Points : 8 178
    Points
    8 178
    Par défaut
    Mais arretez tout simplement de double bufferer, c'est pas complique quand meme

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

Discussions similaires

  1. explorer.exe qui bug, fenêtre, menu et boutons non affichés
    Par oceanbigone dans le forum Windows XP
    Réponses: 12
    Dernier message: 09/12/2008, 22h50
  2. [JMenuBar] Menu non affiché
    Par volontier dans le forum AWT/Swing
    Réponses: 5
    Dernier message: 23/05/2006, 11h15
  3. [APACHE 2] Images / Css Non affichée
    Par djshaker dans le forum Apache
    Réponses: 1
    Dernier message: 22/02/2006, 15h26
  4. [Quick Report] Valeur d'un champ existante mais non affichée
    Par navis84 dans le forum Bases de données
    Réponses: 1
    Dernier message: 31/03/2005, 09h15
  5. [CR 9] Mise en forme non affichée when null
    Par Yorglaa dans le forum Formules
    Réponses: 2
    Dernier message: 28/06/2004, 17h27

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