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

 Java Discussion :

JPanel de taille nulle


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    77
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2013
    Messages : 77
    Par défaut JPanel de taille nulle
    Salut,
    je me retrouve confronté à un petit problème.
    J'ai une classe Plateau qui étend JPanel et à l'intérieur se trouve un tableau de JPanel. J'ai aussi une classe Pion qui représente un joueur et j'aimerai pouvoir initialiser mes pions et les afficher au moment ou le panneau de jeu apparait.

    Cependant pour initialiser les joueurs et les afficher sur le plateau, j'ai besoin de la taille de mon panneau ou de la largeur/hauteur d'une case du tableau mais celles-ci vaut 0 à ce moment. Une fois le plateau affiché, je suis obligé de passer par un bouton intermédiaire qui permet l'affichage des pions or je n'aime pas cette idée.

    Comment on pourrait faire pour afficher en même temps le plateau et les pions (pourquoi le jpanel n'a pas de taille ?)
    merci à qui répondra à ses questions

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut,

    Sans code, difficile de dire pourquoi ci et pourquoi pas ça... En mode layouté, les JPanel se dimensionnent en général par rapport à leur contenu et leur layout manager. Et les layout managers exploitent, selon les cas, les preferredSize, minimumSize, et maximumSize.

    Tout le détail dépend du layout manager. Il faut éviter que ça boucle évidemment : si la taille du Plateau doit dépendre de la taille des cases, qui doivent dépendre de la taille du plateau, on va avoir une boucle dans l'évaluation des tailles. Si le layout est un GridLayout, on a pas besoin de gérer la taille des cases : le plateau a une dimension, et la grille répartit les cases de façon uniforme en largeur et en hauteur (non proportionnel). Ou alors, on donne une taille préférentielle fixe aux cases ( setPreferredSize(new Dimension(...,...))) et on laisse le plateau avec le GridLayout s'adapter (par un pack() sur la fenêtre).

    A noter toutefois qu'il faut penser à n'afficher une fois que le container soit prêt avec ses composants et son layout manager : donc faire le setLayout et les add() avant le setVisible(true) de la frame. Dans le cas contraire, il faut avertir SWING que le contenu à changer et qu'il doit relayouter, ce qu'on peut faire par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    container.revalidate();
    container.repaint();
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    77
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2013
    Messages : 77
    Par défaut
    Je savais pas vraiment quoi montrer comme code.
    En gros oui j'utilise un GridLayout pour mes cases dans la classe Plateau :
    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
    public class Plateau extends JPanel {
    	private Map map;
    	private Pion[] pion = new Pion[2];
    	private boolean turn;
     
     
    	public Plateau(Map map) {
    		this.map = map;
    		setLayout(new GridLayout(map.getWidth(), map.getHeight()));
    		Case[][] tab = map.getTabCase();
    		initializing(tab);
     
    		addMouseListener(new MouseControl());
    		addMouseMotionListener(new MouseControl());
    	}
    Classe Case :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public class Case extends JPanel {
    	protected boolean occupee = false;
    	protected Pion pion;
     
    	public Case() {
    		//setBackground(Color.WHITE);
    		setBorder(BorderFactory.createLineBorder(Color.BLACK));
    	}
    Le plateau se trouve lui meme dans un JPanel. Le problème se situe au niveau du plateau, j'initialise mes pions dans le constructeur du plateau mais ils ne s'affichent pas du fait que le plateau a une taille de 0, et m'affiche donc une erreur "division by zero...". Je ne sais pas ou je pourrai les initialiser et les afficher sans passer par un bouton intermédiaire

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Si la map est bien initialisée avant d'être passée en argument du constructeur de plateau, Normalement, les cases devraient se répartir dans le plateau, par le gridlayout. Si tu ne vois pas ça à l'ouverture, je pense que le setVisible(true) de la fenêtre est fait trop tôt.

    Essaye juste d'ajouter à la fin du constructeur de Plateau :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    revalidate();
    repaint();
    Si la map est initialisée après (par exemple, parce qu'un utilisateur choisit la taille (width et height) après l'affichage, il te faudra adapter pour que le gridlayout soit créé après l'affectation (sinon, évidemment, il y aura 0 cases dans ton plateau). Par exemple, avec une méthode :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public void updateMap() {
       setLayout(new GridLayout(map.getWidth(), map.getHeight()));
       revalidate();
       repaint();
    }
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    77
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2013
    Messages : 77
    Par défaut
    En fait les cases du tableau s'affichent correctement, c'est juste que si j'initialise les pions (après avoir calculer leur emplacement dans le Plateau selon sa width et sa height) dans le constructeur de Plateau, une erreur "division by zero.." apparait car apparemment la taille des cases est de 0 !
    Il faut que le Plateau s'affiche en premier pour que je puisse initialiser mes pions et les afficher, or j'aimerai que le plateau s'affiche avec les pions déjà dedans , est ce possible ?

  6. #6
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Je ne comprends pas pourquoi tu aurais une division par zéro. C'est quoi ta formule de calcul ?

    Sinon, dans le principe, je dirais que tu pourrais faire le calcul sur écoute de ComponentListener.resizedComponent(), en ne faisant pas le calcul si la taille est 0 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    panel.addComponentListener(new ComponentAdapter() {
     
        @Override
        public void componentResized(ComponentEvent e) {
             Dimension size = e.getComponent().getSize();
    	 if(  size.width>0 && size.height>0 ) {
                  ... 
    	 }
        }
     
    });
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

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

Discussions similaires

  1. [téléchargement PJ] Pièce jointe de taille nulle
    Par btdl79 dans le forum Internet
    Réponses: 8
    Dernier message: 26/06/2012, 11h09
  2. supprimer fichier taille nulle
    Par ricololo dans le forum Linux
    Réponses: 3
    Dernier message: 20/02/2009, 08h56
  3. JPanel contenant deux JPanel definir taille de l un d eux
    Par mereyj dans le forum Agents de placement/Fenêtres
    Réponses: 2
    Dernier message: 20/06/2005, 21h40
  4. [jpanel] Modifier la taille...
    Par scorpiwolf dans le forum Agents de placement/Fenêtres
    Réponses: 7
    Dernier message: 01/07/2004, 17h11

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