Forum Programmation.java Gridbaglayout et GTK

Posté par  (site web personnel) .
Étiquettes : aucune
0
17
déc.
2004
Bonjour,

Aujourd'hui je vais vous parler de GridBagLayout, que je considère comme le meilleur layout java (mis a part null, c'est le seul layout avec lequel j'arrive, au bout d'un moment, a faire a peu près ce que je veux...)

Problème : oui certes GridBagLayout marche nickel, mais pas comme je veux !
Quand a l'epoque je faisais du Gtk, jme souviens que je réalisais mes interfaces trop simplement, et avec gridbaglayout, c'est beaucoup plus complexe :(

Voilà par exemple ce que j'aimerai faire :
http://fuck.the.world.free.fr/gridbag.png(...)
Et ce que j'obtiens a l'execution :
http://fuck.the.world.free.fr/rendu.png(...)
Note : les boutons d'en bas, j'aimerai qu'ils ne soient pas redimensionnés, meme si on maximise la fenetre. Le reste c'est ok parcontre.

En gtk, je me contentais de dessiner mon interface d'abord sur feuille, je la remettais dans un contexte de grille, et en 3 minutes j'avais les coordonnées de chacun des mes controles, j'avais plus qu'a coder ca.
Avec le gridbaglayout, je dois spécifié des poids, et parfois je pige plus rien du tout. Quand un composant a un poids a 1 en largeur, le composant situé juste au dessous de lui se voit adopter la meme largeur, ou que des trucs bizzares de ce style, qui me déroute totalement par rapport a gtk ou la gestion des "poids" etait il me semble facultative (inexistante ?)

Bref, si quelqu'un peut me donner une "astuce" pour m'expliquer comment a partir de mon schema 1, je peux obtenir "a coup sûr" mon resultat escompté, je lui en serais super méga reconnaissant, car je tatonne a chaque fois 2 heures avant de réussir une interface correcte, et mon systeme de grille sous gtk j'ladorais.

Merci enormément

- cho7, déséspéré par les GridBagLayout -
  • # moi ce que je fais

    Posté par  (site web personnel) . Évalué à 2.

    Je suis pas un spécialiste mais j'ai plusieurs "méthodes" pour résoudres mes problèmes avec Swing :
    - quand je veux pas qu'un contrôle se fasse redimensionner, je l'encapsule dans un JPanel qui a un FlowLayout (apparement c'est le seul layout qui redimensionne pas son contenu !)
    - de manière générale je mélange les layout entre eux selon la situation, en regroupant des contrôles dans des JPanel
    - pour les composants graphiques qui n'ont pas de taille particulière mais qui se retrouvent dans un Layout je n'oublies pas de fixer setPrefferedSize et setMinimumSize

    mais bon c'est clair que j'ai également pleuré en passant de GTK à Swing.
    • [^] # Re: moi ce que je fais

      Posté par  (site web personnel) . Évalué à 1.

      Le truc de l'encapsulation j'viens de tester c'est sympa merci.
      Mais bon pour faire une interface vraiment complexe, je pense que le GridBagLayout est LA solution, mais c_relou(tm)

      Je suis donc toujours a la recherche d'une solution ultime, me permettant de "penser" mes interfaces, comme je le faisais en gtk avec ma ptite feuille de papier, ma grille, et mon stylo. GridBagLayout en fait trop je trouve.

      Là par exemple, sur ma grille, on voit clairement que j'ai sauté des lignes entres mes controles. Bah ce gros béta va me les zapper et va me coller mes controles entre eux ! si c'est pas pour me contrarier ca hein ?
      Je me retrouve a mettre dans les zones "vide" des JLabel vide a poids fort pour forcer swing a laisser mes lignes vides dans le gridBagLayout.

      Rahhhh, si j'en avais les compétences, je créerai le "GTKLayout", et je le distribuerai a la terre entière, qui je pense a trop souffert avec ce layout bien trop complexe pour un cerveau a niveau d'intelligence modéré
    • [^] # Re: moi ce que je fais

      Posté par  (site web personnel) . Évalué à 1.

      Bon c'est encore moi,
      Pour ceux que ca interresse et qui ne connaissent pas encore, je viens de découvrir la class GraphPaperLayout, qui est presque le layout parfait pour moi : super simple a utiliser, il est une sorte de Absolute Positioning, mais sur une grille faite maison, donc en gros on est dans un style assez semblable a ce que je faisais sous gtk :)

      Ainsi on créé une grille de 5x5 par exemple puis :
      setLayout(new GraphPaperLayout(new Dimension(5,5)));
      add(new Button("plop"), new Rectangle(0,0,1,1)); //ici la syntaxe c'est (posX,posY,longueur du controle,hauteur du controle), une unité valant une case de la grille.


      Voilou, c'est super con a manipuler, et c'est a mon sens bien plus pratique que le gridbaglayout (oui ca gere pas les différents poids, mais bon ca me convient !)

      Voilou


      P.S : la classe GraphPaperLayout est ici : http://java.sun.com/docs/books/tutorial/uiswing/layout/example-1dot(...)
      • [^] # Re: moi ce que je fais

        Posté par  . Évalué à 1.

        Je ne suis pas un spécialiste, mais j'ai eu à créer
        qques interfaces en java et pour le dire brutalement :
        swing c'est vraiment de la m.... pour créer vite des
        interfaces simples...

        J'avais fini par trouver TableLayout, qui n'est pas dans
        les bibliothèques de Sun, mais était dix fois plus simple.
        Je ne m'en souviens pas en détail mais ca a l'air de
        ressembler à ton GraphPaperLayout...

        TableLayout : http://www.clearthought.info/software/TableLayout/(...)
      • [^] # Re: moi ce que je fais

        Posté par  . Évalué à 1.

        Salut,

        J'ai essayé d'utiliser la classe GraphPaperLayout mais en vain, je n'arrrive pas à utiliser.
        COmment fais tu pour l'initialiser et l'utiliser par la suite???

        Merci d'avance.
        • [^] # Re: moi ce que je fais

          Posté par  (site web personnel) . Évalué à 1.

          Bah tu créé une nouvelle classe dans ton éditeur favori dans lequel tu vas importer la classe GraphPaperLayout, soit en copie-collant le contenu du fichier GraphPaperLayout.java dans une classe vide nommée GraphPaperLayout, soit en important directement le .java depuis ton éditeur.

          Une fois mis dans le meme dossier que ton appli, ou en tout cas vérifie que les import/package vont bien, bah tu créé une nouvelle classe, que tu fais hériter de JFrame, puis dans le constructeur de la classe tu mets par exemple :

          setLayout(new GraphPaperLayout(new Dimension(29,13)));
          //(x,y,longueur,hauteur)
          add(gauche, new Rectangle(1,1,10,10));
          add(btnDroite,new Rectangle(12,2,5,1));
          add(btnGauche,new Rectangle(12,4,5,1));
          add(droite, new Rectangle(18,1,10,10));
          add(btnAnnuler,new Rectangle(17,12,5,1));
          add(btnOK,new Rectangle(23,12,5,1));
          pack();

          Pour le positionnement des controles c'est simple :
          new Rectangle(CoinHautGaucheDuBouton_X,CoinHautGaucheDuBouton_Y,longueur du bouton, hauteur du bouton)

          Voilà, que dire de plus ?
  • # Swing

    Posté par  . Évalué à 1.

    Salut,

    pour Swing il faut en général combiner les propriétés de plusieurs Layout : BorderLayout pour l'emplacement "en gros" des composants, et GridBagLayout pour les formulaire , FlowLayout eventuellement pour les barres de boutons.

    Pour répondre a ta question, tes trois panels du haut sont un JPanel avec un BorderLayout, panel lui meme inclu en BorderLayout.CENTER. La barre de bouton du bas est un FlowLayout orienté à l'est inclu en BorderLayout.SOUTH

    Le code ressemble a peu pres à ca :

    jPanel1 = new javax.swing.JPanel();
    jLabel1 = new javax.swing.JLabel();
    jLabel2 = new javax.swing.JLabel();
    jLabel3 = new javax.swing.JLabel();
    jPanel2 = new javax.swing.JPanel();
    jButton1 = new javax.swing.JButton();
    jButton2 = new javax.swing.JButton();

    setLayout(new java.awt.BorderLayout());

    jPanel1.setLayout(new java.awt.BorderLayout());

    jLabel1.setText("jLabel1");
    jPanel1.add(jLabel1, java.awt.BorderLayout.WEST);

    jLabel2.setText("jLabel2");
    jPanel1.add(jLabel2, java.awt.BorderLayout.CENTER);

    jLabel3.setText("jLabel3");
    jPanel1.add(jLabel3, java.awt.BorderLayout.EAST);

    jPanel2.setLayout(new java.awt.FlowLayout(java.awt.FlowLayout.RIGHT));

    jButton1.setText("jButton1");
    jPanel2.add(jButton1);

    jButton2.setText("jButton2");

    jPanel2.add(jButton2);

    jPanel1.add(jPanel2, java.awt.BorderLayout.SOUTH);

    add(jPanel1, java.awt.BorderLayout.CENTER);

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.