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 :

Problème d'affichage du contenu de JPanel


Sujet :

AWT/Swing Java

  1. #1
    Membre du Club Avatar de Mic75
    Homme Profil pro
    Développeur Frontend
    Inscrit en
    Janvier 2006
    Messages
    143
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur Frontend
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 143
    Points : 52
    Points
    52
    Par défaut Problème d'affichage du contenu de JPanel
    Bonjour,

    Je rencontre actuellement un problème que je n'arrive pas à résoudre malgré mes recherches. Je précise que je développe sous l'IDE netbeans 6, sous linux.
    L'application à réaliser est un simulateur de vivarium.

    Le problème est le suivant :
    Le cadre de mon application est une JFrame, qui elle même contient un JPanel qui sera utiliser pour visualiser le vivarium. Ce JPanel contient à son tour un JPanel qui est un attribut d'une classe que j'ai appelé GTerrain.
    Enfin, le JPanel de la classe GTerrain, contient des cases qui sont représentées graphiquement par des JButton, j'ajoute donc ces JButon au JPanel de GTerrain.

    Quand je lance mon projet je m'attends donc à ce que ma JFrame contienne un quadrillage de boutons, mais malheureusement ils n'apparaissent pas.

    Au niveau du code ça donne :
    Dans ma JFrame (code généré par Netbeans) :
    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
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
     
    public class JFramarium extends javax.swing.JFrame {
     
        /** Creates new form JFramarium */
        public JFramarium() {
            initComponents();
        }
     
        /** This method is called from within the constructor to
         * initialize the form.
         * WARNING: Do NOT modify this code. The content of this method is
         * always regenerated by the Form Editor.
         */
        // <editor-fold defaultstate="collapsed" desc="Generated Code">
        private void initComponents() {
     
            GTerrain terrain ;
            viewer = new javax.swing.JPanel();
     
            setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
            setTitle("La guerre des mondes");
            setResizable(false);
     
            terrain = new GTerrain(viewer) ;
            viewer.add(terrain.getJPTerrain()) ;
     
            org.jdesktop.layout.GroupLayout viewerLayout = new org.jdesktop.layout.GroupLayout(viewer);
            viewer.setLayout(viewerLayout);
            viewerLayout.setHorizontalGroup(
                viewerLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                .add(0, 400, Short.MAX_VALUE)
            );
            viewerLayout.setVerticalGroup(
                viewerLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                .add(0, 468, Short.MAX_VALUE)
            );
     
            org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(getContentPane());
            getContentPane().setLayout(layout);
            layout.setHorizontalGroup(
                layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                .add(viewer, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
            );
            layout.setVerticalGroup(
                layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                .add(layout.createSequentialGroup()
                    .add(viewer, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                    .addContainerGap(102, Short.MAX_VALUE))
            );
     
            java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
            setBounds((screenSize.width-410)/2, (screenSize.height-600)/2, 410, 600);
        }// </editor-fold>
     
     
        // Variables declaration - do not modify
        private javax.swing.JPanel viewer;
        // End of variables declaration
     
    }
    Dans ma classe GTerrain :
    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
    public class GTerrain extends Terrain {
     
        JPanel jpTerrain ; //Le JPanel ajouté au JPanel de la JFrame
     
        GTerrain(JPanel viewer)
        {
            super((int) viewer.getHeight()/GCase.hauteur, 
                  (int) viewer.getWidth()/GCase.largeur ) ;
     
            jpTerrain = new JPanel() ;
            for(int i=0;i<getHauteur();i++)
            {
                for(int j=0;j<getLargeur();j++)
                {
                    GCase tmpGC = new GCase(getCase(i,j)) ;
                    jpTerrain.add(tmpGC.getJBCase()) ; //Ici j'ajoute les boutons qui représentent des cases
                }
            }
        }
     
        public JPanel getJPTerrain(){
            return jpTerrain ;
        }
    }
    Enfin dans ma classe GCase :
    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
    public class GCase extends Case {
        private JButton jbCase ; //on utilise le composant jpanel pour representer une case
        static int hauteur = 10 ;         //hauteur en pixel
        static int largeur = 10 ;         //largeur en pixel
     
        public GCase(Case c){
            super(c.getX(),c.getY()) ;
            jbCase = new JButton() ;
            jbCase.setSize(hauteur,largeur) ;
        }
     
        public JButton getJBCase()
        {
            return jbCase ;
        }
     
    }
    Désolé pour la taille du code, mais je pense que tout ce que j'ai affiché peut s'avérer utile pour comprendre mon erreur.

    Merci d'avance pour vos réponses

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    572
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Février 2007
    Messages : 572
    Points : 675
    Points
    675
    Par défaut
    Si tu positionnes toi-meme les boutons, il faut mettre le layout du panel à null.

  3. #3
    Membre du Club Avatar de Mic75
    Homme Profil pro
    Développeur Frontend
    Inscrit en
    Janvier 2006
    Messages
    143
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur Frontend
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 143
    Points : 52
    Points
    52
    Par défaut
    Bonjour.

    Merci pour ta réponse. Mais en fait je ne voit pas pourquoi je devrais mettre le layout du Panel (lequel au fait ?) à NULL, parce qu'il me semble que par défaut c'est le LayoutManager qui est utilisé, ce qui dans mon cas convient.

    Merci d'avance pour les précisions.

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    572
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Février 2007
    Messages : 572
    Points : 675
    Points
    675
    Par défaut
    Le layoutmanager par defaut d'un panel est un FlowLayout.

    A partir du moment ou tu donnes une position et une dimension fixe à un component, il faut, pour que tes valeurs ne soient pas ecrasées, que le layout du container parent soit null.

    Dans ton cas, il y a je crois au moins le jpanel qui contient les cases.

  5. #5
    Membre du Club Avatar de Mic75
    Homme Profil pro
    Développeur Frontend
    Inscrit en
    Janvier 2006
    Messages
    143
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur Frontend
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 143
    Points : 52
    Points
    52
    Par défaut
    qu'il me semble que par défaut c'est le LayoutManager qui est utilisé, ce qui dans mon cas convient
    Désolé, je suis pas réveillé aujourd'hui, je voulais dire que par défaut le LayoutManager utilisé était le FlowLayout . Par contre je ne savais pas qu'il écrasait les composants si on les fixait. Je vais essayé de ce pas .

  6. #6
    Membre du Club Avatar de Mic75
    Homme Profil pro
    Développeur Frontend
    Inscrit en
    Janvier 2006
    Messages
    143
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur Frontend
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 143
    Points : 52
    Points
    52
    Par défaut
    Bon alors, j'ai bien défini le LayoutManager du JPanel de GTerrain qui contient les cases à null, malheureusement cela reste sans effet. J'ai simplement rajouter la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    jpTerrain.setLayout(null)
    dans le constructeur de la classe GTerrain (cf plus haut pour le code).

    Y a-t-il quelque chose d'autre à faire ?

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    572
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Février 2007
    Messages : 572
    Points : 675
    Points
    675
    Par défaut
    Il faut aussi fixer la taille du jpanel avec un layout à null.

    Une autre solution serait d'utiliser un gridlayout, a la place du flowlayout. Comme ca ton appli supporterait le redimensionnement.

  8. #8
    Membre du Club Avatar de Mic75
    Homme Profil pro
    Développeur Frontend
    Inscrit en
    Janvier 2006
    Messages
    143
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur Frontend
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 143
    Points : 52
    Points
    52
    Par défaut
    Donc en plus de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    jpTerrain.setLayout(null)
    je viens de rajouter un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    jpTerrain.setSize(new Dimension(largeur,hauteur)) ;
    Cependant aucun changement, ma grille de boutons reste invisible à l'écran.
    Pour rappel : j'ai ma JFrame qui contient un JPanel (viewer) qui contient un JPanel jpTerrain (auquel je viens d'appliquer les modifications) qui contient à son tour les boutons.

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    572
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Février 2007
    Messages : 572
    Points : 675
    Points
    675
    Par défaut
    Je crois que tu as oublié d'ajouter viewer à la JFrame.

  10. #10
    Membre du Club Avatar de Mic75
    Homme Profil pro
    Développeur Frontend
    Inscrit en
    Janvier 2006
    Messages
    143
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur Frontend
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 143
    Points : 52
    Points
    52
    Par défaut
    Ben en fait l'ajout de viewer a ma JFrame c'est netbeans qui gère, étant donné que j'ai fait ça à la souris sous le designer.

    Par contre le code de NetBeans je comprends pas, il utilise une technique particulière, un layoutGroup on dirait ou quelque chose dans le genre.

    Autre info, je ne fixe plus les dimensions, donc j'ai viré le setSize et le setLayout, donc en théorie c'est le FlowLayout qui gère tout, pourtant toujours pas d'affichage

  11. #11
    Membre du Club Avatar de Mic75
    Homme Profil pro
    Développeur Frontend
    Inscrit en
    Janvier 2006
    Messages
    143
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur Frontend
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 143
    Points : 52
    Points
    52
    Par défaut
    Bon alors j'ai complètement changé de stratégie, j'utilise désormais un GridLayout pour le JPanel contenant les Cases, ce qui est en fait bien plus logique.
    La seule chose qui ne va pas maintenant c'est que ma JFrame est minuscule quand je lance l'appli.

  12. #12
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    572
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Février 2007
    Messages : 572
    Points : 675
    Points
    675
    Par défaut
    As tu pensé a appeler setPreferredSize, sur les JButton

  13. #13
    Membre du Club Avatar de Mic75
    Homme Profil pro
    Développeur Frontend
    Inscrit en
    Janvier 2006
    Messages
    143
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur Frontend
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 143
    Points : 52
    Points
    52
    Par défaut
    Bon comme dit j'ai changé de stratégie. Car je n'arrive pas à utiliser le mode free design de Netbeans. En gros il faut créer des Beans pour pouvoir ajouter des éléments autres que ce de la palette standard et je ne sais pas trop comment faire, donc j'ai décidé d'utiliser les autres manager.

    Donc pour ma fenêtre principale j'utilise un BorderLayout. Je place ma grille de JButton au centre et le menu du bas dans la partie Sud.
    Le résultat est plutot correcte, le seul hic c'est quand j'étire ma fenêtre vers la droite. En effet il y a un espace entre ma grille et le bord droit de ma fenêtre (la bordure Est pour le BorderLayout).

    Donc ma question est comment faire pour que la grille colle à la fenêtre, même quand je redimensionne ?

    Merci d'avance pour les réponses.

Discussions similaires

  1. [eZ Publish] Problème d'affichage de contenu Bloc XML
    Par M1000 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 3
    Dernier message: 09/03/2010, 16h57
  2. Problème d'affichage de contenu sur site fullflash
    Par XSphreak dans le forum ActionScript 1 & ActionScript 2
    Réponses: 0
    Dernier message: 25/10/2009, 03h59
  3. affichage du contenu de JPanel
    Par sky88 dans le forum AWT/Swing
    Réponses: 3
    Dernier message: 25/03/2008, 01h41
  4. Réponses: 2
    Dernier message: 14/01/2008, 17h32
  5. probléme d'affichage du contenu d'un fichier
    Par developppez dans le forum C
    Réponses: 2
    Dernier message: 20/04/2006, 19h16

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