4 pièce(s) jointe(s)
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:
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:
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:
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:
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.