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 :

JLayeredPane / Probleme de rafraichissement


Sujet :

AWT/Swing Java

Mode arborescent

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Novembre 2010
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 15
    Par défaut JLayeredPane / Probleme de rafraichissement
    Bonjour tout le monde,
    Voici mon premier post sur ce forum.

    Je profite d'une année de vacance pour m'essayer à la programmation d'un petit jeu vidéo.

    Ayant tendance a faire des posts a rallonge, je l'ai séparé en deux parties :
    - Le contexte
    - Le problème

    J'invite donc les personnes ne voulant pas consacrer trop de temps a passer directement à la partie 2.



    ###############################################
    ################### LE CONTEXTE ##################
    ###############################################



    J'ai choisi l'API Swing pour la gestion des menus.

    J'ai créé un JLayeredPane avec plusieurs niveaux :
    - niveau 0 : Le jeu proprement dit
    - niveau 1 : La barre de raccourci vers les différents menus
    - niveau 2+ : Les menus affichés


    ( Pour l'instant, le niveau 0 se limite à un vide intersidéral ! )

    Je me suis concentre sur les niveaux 1 + :

    Lors du chargement de mon jeu, je charge la barre de menu associe a l'écran principal.
    Pour cela, j'utilise une classe ToolbarController :

    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
     
    public class ToolbarController implements ActionListener  {
     
    	JLayeredPane pane;
    	[...]
     
    	//Constructeur
    	public ToolbarController( JLayeredPane pane )
    	{
    		this.pane 		= pane;
    		init();
    	}
     
    	//Rajout d'un menu a la toolbar
    	public void addSheet( SheetController controller ) [...]
     
     
    	//Listener sur les boutons de la toolbar
    	public void actionPerformed(ActionEvent evt) [...]
     
    	//Affiche ou cache un menu lors du click sur l'icon. Les 'Sheet' sont affiches dan les niveaux 2+
    	public void toggleSheet( String sheetName ) [...]
     
    	//Methode appelée par toggleSheet pour positionner le panel
    	private void setSheet( SheetPanel sheet ) [...]
    }
    Le ToolbarController se branche sur le JLayeredPane de ma frame principale et s'occupe de gérer les couches 1+;

    Lors du chargement de l'écran principal, la méthode addSheet est appelée.
    Le SheetController dispose des informations suivantes :
    • L'icone associée au menu
    • Un SheetPanel qui contient le menu affichable

    addSheet crée un bouton dans le niveau permettant d'afficher / cacher le SheetPanel et stocke le SheetPanel dans une map :

    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
     
    public void addSheet( SheetController controller ) 
    {
    	String paneName = controller.getPanel().getName();
     
    	JButton button = new JButton();
     
    	DataManager.setButtonIcons(button, controller.getPanel().getIcon() );
     
    	button.setVerticalAlignment(JLabel.CENTER);
    	button.setHorizontalAlignment(JLabel.CENTER);
    	button.setBounds( TOOLBARELT_SPACE,
    					  TOOLBARELT_SPACE + toolBarIndex * ( 2 * TOOLBARELT_SPACE + TOOLBARELT_HEIGHT), 
    					  TOOLBARELT_WIDTH, 
    					  TOOLBARELT_HEIGHT);
     
    	//button.setMnemonic(KeyEvent.VK_D);
    	button.setActionCommand( paneName );
    	button.addActionListener(this);
     
    	iconMap.put( paneName , button );
    	controllerMap.put( paneName, controller);
     
    	pane.add( button, TOOLBAR_INDEX);
    	toolBarIndex++;
    }
    Lors de l'appuie sur le bouton nouvellement créé, le ToolbarController déclenche la méthode toggleSheet qui s'occupe d'ajouter ou supprimer le SheetPanel dans le LayeredPane :

    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
     
    public void toggleSheet( String sheetName )
    {
    	//Precaution
    	if( ! iconMap.containsKey( sheetName ) ) return;
    	if( ! controllerMap.containsKey( sheetName ) ) return;
     
    	JButton button = iconMap.get( sheetName );
    	SheetPanel sheet = controllerMap.get( sheetName ).getPanel();
     
    	//Check if the sheet is already displayed
    	if( displayedSheets.indexOf( sheet ) != -1 ) //Pane already opened --> we hide it
    	{
    		button.setSelected( false );
    		pane.remove( sheet );
     
    		displayedSheets.remove( sheet );
    	}
    	else // Pane not open --> We display it
    	{
    		button.setSelected( true );
     
    		setSheet( sheet );
     
    		displayedSheets.add( sheet );
    		currentIndex++;
    	}
     
    	//Update display
    	pane.validate();
    }
    Cette méthode fait appel a setSheet qui se charge de positionner le panel dans le JLayeredPane :

    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
     
        private void setSheet( SheetPanel sheet )
        {
    		// Center the element
    		int sheetWidth = sheet.getWidth();
    		int sheetHeight = sheet.getHeight();
     
    		int widthReserved = TOOLBARELT_WIDTH + 2 * TOOLBARELT_SPACE;
     
    		int windowWidth = ViewManager.getWindowsWidth();
    		int windowHeight = ViewManager.getWindowsHeight();
     
    		int x = widthReserved + ( windowWidth - sheetWidth ) / 2;
    		int y = ( windowHeight - sheetHeight ) / 2;
     
    		sheet.setBounds(x, y, sheetWidth, sheetHeight);
     
    		pane.add( sheet, currentIndex );
    		sheet.repaint();
    		sheet.validate();
       }


    ###############################################
    ################### LE PROBLEME ##################
    ###############################################


    Mon problème est le suivant :

    L'ajout des boutons dans la barre de raccourci fonctionne.
    Par contre, lors du clic sur un de ses boutons, le boulot ne se fait qu'à moitié :
    • Le panel s'ajoute bien a mon LayeredPane
    • Son contenu s'affiche mal : Il faut que je passe ma souris au dessus des différents boutons pour que ces derniers s'affichent


    Petit exemple en image en pièces jointes.


    ###############################################
    ################### REMARQUES ###################
    ###############################################


    Je ne sais pas si Swing est la solution la plus adaptée pour mon projet.
    Le projet en question se lancera dans une frame externe et utilisera un peu de Java3 pour le jeu proprement dit.
    Je suis tout ouïe si vous avez des suggestions.

    Merci d'avance pour toute l'aide que vous pourrez m'apporter.
    Images attachées Images attachées    
    Fichiers attachés Fichiers attachés

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

Discussions similaires

  1. [Image] Probleme de rafraichissement
    Par leyee dans le forum 2D
    Réponses: 4
    Dernier message: 31/10/2005, 22h26
  2. Probleme de rafraichissement Fenetre Win32 ...
    Par miaw dans le forum OpenGL
    Réponses: 1
    Dernier message: 09/05/2005, 08h59
  3. Probleme de rafraichissement d'un BDGrid
    Par marmotte dans le forum Bases de données
    Réponses: 10
    Dernier message: 28/05/2004, 18h07
  4. Probleme de rafraichissement
    Par glRaZ dans le forum C++Builder
    Réponses: 5
    Dernier message: 23/03/2004, 14h07
  5. [MFC] probleme de rafraichissement d'une image
    Par Vestaproman dans le forum MFC
    Réponses: 6
    Dernier message: 09/01/2004, 23h59

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