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 :

[JAVA] - Tableau de JPanels


Sujet :

AWT/Swing Java

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 51
    Par défaut [JAVA] - Tableau de JPanels
    Bonjour et bonne année à tous

    Je souhaite développer un petit jeu, un mastermind en fait, et je dois donc afficher 10 lignes de 4 pions pour les essais du joueur.

    Mon problème c'est justement de les afficher !
    Je me suis limité pour l'instant à l'affichage des 'trous' vides dans lesquels le joueur placera par la suite ses pions.

    Voici les démarches que j'ai effectués :

    - Affichage dans un JPanel de la même image représentant un trou.
    Problème : Seul la dernière image est affichée.

    - J'ai donc pensé à faire un tableau de JPanels, en fait afficher une seule image dans un seul panel, et crée 10x4 panels...
    Problème : Déjà ça ne fonctionne pas, le code ne contient pas d'erreurs mais me génère une erreur "java.lang.NullPointerException". En plus, cette méthode me semble être assez lourde vu le nombre de panels à créer (surtout qu'il y aura d'autres panels à créer par la suite).

    - Ayant besoin de localiser mes images afin de pouvoir les remplacer par la couleur choisie par le joueur, il faut tout de même que je puisse localiser mes pions. Il faudrait donc un tableau d'images que je collerai sur mon panel.
    Problème : Je ne sais pas trop comment écrire ça, je n'arrive pas à trouver de solution ni sur le net, ni sur la javadoc. J'ai bidouillé un peu dans mon coin mais j'obtiens la même erreur à l'execution du prog : "java.lang.NullPointerException".

    Voici le code de mon initialisation :
    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 init(){
     
    		int posX=-35;
    		int posY=-35;
     
    		for(int j=0; j<10; j++)
    		{
    			for(int i=0; i<10; i++)
    			{
    				pionsBlank.setBounds(posX+35,posY+35,30,30);
    				tabPionsEssai[i][j].add(pionsBlank);
    				panePrincipal.add(tabPionsEssai[i][j]);
    				posX=+35;
    			}
    			posY=+35;
    			j=+1;
    		}
    	}
    en sachant que j'ai déclaré ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     String imgBlank = ".\\Jeux\\mastermind resources\\Blank.png";
     
     Affichage pionsBlank = new Affichage(imgBlank);
     
     JPanel tabPionsEssai[][]={null};
    et ma classe Affichage :
    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
    public class Affichage extends Canvas{
     
    	private static final long serialVersionUID = 1L;
     
    	Image img;
     
    	public Affichage(String imageLink){
    		img=getToolkit().getImage(imageLink);
    		prepareImage(img,this);
    	}
     
    	public void paint(Graphics g){
    		g.drawImage(img, 0, 0, this);
    	}
     
    }
    Voilà, si quelqu'un avait une idée sur comment palier mon problème.
    Déjà je pense qu'un tableau d'images serait mieux qu'un tableau de JPanel ^_^

    Merci d'avance

  2. #2
    Membre émérite Avatar de Pollux
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    706
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2005
    Messages : 706
    Par défaut
    Tu es obligé de passer par des JPanel? Parce que sinon moi je verrai bien de passer par une JTable ou encore une JList...

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 51
    Par défaut
    Non pas du tout mais disons que pour la présentation des éléments c'est plus sympa.

    Mais je suis en train de tester avec un seul panneau en GridLayout.

    Ce coup-ci ça fonctionne, mais je suis déjà confronté à un nouveau problème :

    Quand je réinitialise (nouveau jeu), les éléments s'ajoutent au précédents au lieu de les remplacer (j'ai pourtant utilisé du pane.remove(Component) avant de faire un nouveau pane.add(Component).

    Exemple :

    | 1 | 2 | 3 | 4 |
    | 1 | 2 | 3 | 4 |
    | 1 | 2 | 3 | 4 |
    ...
    ..
    .

    devient après réinitialisation :

    | 1 1 | 2 2 | 3 3 | 4 4 |
    | 1 1 | 2 2 | 3 3 | 4 4 |
    | 1 1 | 2 2 | 3 3 | 4 4 |
    ...
    ..
    .

    au lieu de redonner le premier schéma...

    Et j'anticipe déjà l'un des prochains problèmes qui sera de repérer la position d'un élément pour le remplacer ! (Je n'ai trouvé nullepart dans la JavaDoc comment obtenir la position d'un éléments dans un panel Grid...) mais bon, un problème à la fois ^_^

  4. #4
    Membre émérite Avatar de Pollux
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    706
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2005
    Messages : 706
    Par défaut
    Citation Envoyé par kronos85 Voir le message
    Non pas du tout mais disons que pour la présentation des éléments c'est plus sympa.
    Pourquoi? Ton problème serait rapidement réglé avec une JTable.

    Pour ton problème de layout voici ce que dit la javadoc:
    Note: If a component has been added to a container that has been displayed, validate must be called on that container to display the new component. If multiple components are being added, you can improve efficiency by calling validate only once, after all the components have been added.
    Tu as bien fait un validate?

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 51
    Par défaut
    Je n'avais en effet pas pensé à le rajouter, mais de toute façon ça ne change pas le problème, je vois simplement qu'il fait un rafraichissement supplémentaire :s

    [EDIT] Problème de rafraîchissement résolu grâce à la commande removeAll(); dans le panneau approprié

  6. #6
    Membre émérite Avatar de Pollux
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    706
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2005
    Messages : 706
    Par défaut
    Montre un le bout de ton code où tu effectues la mise à jour de l'affichage

  7. #7
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Par défaut
    L'idéal serait d'utiliser une image calculée, par exemple un java.awt.image.BufferedImage.

    Un exemple rapide : surcharge un JPanel qui affichera le buffer :
    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
     
    public class Affichage extends JPanel
    {
    	BufferedImage img;
    	Graphics2D graph;
     
    	public Affiche( int w, int h )
    	{
    		img = new BufferedImage( w, h, BufferedImage.TYPE_INT_ARGB );
    		graph = img.createGraphics();
    	}
     
    	public void update( Graphics g )
    	{
    		paint( g );
    	}
     
    	public void paint( Graphics g )
    	{
    		if( img != null )
    		{
    			g.drawImage( img, 0, 0, this );
    		}
    	}
    }

    Pour initialiser l'image, tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    graph.setColor( Color.BLACK );
    graph.fillRect( 0, 0, img.getWidth(), img.getHeight() );
    Et pour afficher une image quelconque dans le buffer (this représente l'instance de la classe Affichage) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    graph.drawImage( mon_image, x, y, this );
    Tu peux même ajouter pleins d'effets, regarde les tutoriels sur Graphics2D.
    Tu peux aussi utiliser le double ou triple buffering avec les BufferStrategy.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 51
    Par défaut
    @ Pollux :

    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
    public void init(){
     
    		if(reset==1)
    		{
    			paneNumeroEssai.removeAll();
    			panePionsEssai.removeAll();
    			panePionsResultat.removeAll();
    		}
    		for(int j=0; j<10; j++)
    		{
    			for(int i=0; i<4; i++)
    			{
    				panePionsEssai.add(new Affichage(imgBlank));
    				panePionsResultat.add(new Affichage(imgResBlank));
    			}
    			paneNumeroEssai.add(new JLabel(""+(j+1),SwingConstants.CENTER));
    		}
    		panePrincipal.add(paneNumeroEssai);
    		panePrincipal.add(panePionsEssai);
    		panePrincipal.add(panePionsResultat);
    		setContentPane(panePrincipal);
     
    	}
    j'ai rajouté quelques composants entre-temps ^^



    @dinobogan :

    Merci beaucoup c'est sympa ! J'y jetterais un coup d'oeil... plus tard ! Pour l'instant je vais me cantonner à la solution que j'ai trouvée.
    Je suis encore en école d'ingé et j'ai commencé mes cours de JAVA seulement cette année (y'a 2~3 mois quoi...). J'aurais certainement des cours un peu plus approfondis plus tard et je pense qu'on verra tout ça ! Je prends un peu d'avance parceque ça me botte bien, mais je veux pas non plus finir mon programme tout de suite ^^


    Merci encore à tous les deux !

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

Discussions similaires

  1. Java Desktop Application & JPanel
    Par your@ dans le forum Interfaces Graphiques en Java
    Réponses: 1
    Dernier message: 28/06/2009, 10h55
  2. [java] Tableau (operation sur les tableaux)
    Par Jessika dans le forum Collection et Stream
    Réponses: 5
    Dernier message: 04/01/2007, 14h40
  3. [JAVA] Tableau
    Par torNAdE dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 08/05/2006, 10h53
  4. [Java] Empiler 2 Jpanel au north avec un BorderLayout
    Par lerotou dans le forum Agents de placement/Fenêtres
    Réponses: 3
    Dernier message: 07/02/2006, 20h55
  5. [Débutant] Définir un tableau de JPanel
    Par etiennegaloup dans le forum Agents de placement/Fenêtres
    Réponses: 7
    Dernier message: 20/07/2005, 11h22

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