Placer 3 boutons a un endroit précis !

Résolu/Fermé
killdragon Messages postés 33 Date d'inscription lundi 17 décembre 2012 Statut Membre Dernière intervention 1 janvier 2013 - 18 déc. 2012 à 18:07
killdragon Messages postés 33 Date d'inscription lundi 17 décembre 2012 Statut Membre Dernière intervention 1 janvier 2013 - 19 déc. 2012 à 18:42
Bonjour,

je suis en train de me battre pour placer des boutons avec les layouts, mon but était d'avoir un écran imaginairement divisé en 4 parties égales, en ayant mis les bouton en haut a droite, les uns sous les autres sans toucher aux autres cases...

Je voudrais donc découper mon écran en 4 grosses cases puis n'en occuper qu'une seule (a savoir celle en haut a droite) et dedans mettre 3 boutons, les uns en dessous des autres.
Le soucis c'est que je voudrais faire en sorte de conserver 4 cases seulement et les méthodes que j'ai trouvé me donneraient donc 12 cases pour placer mes boutons...

Auriez vous une solution?


Voila mon code :


public class Fenetre extends JFrame {
    private JPanel container = new JPanel(); 
    private JPanel pan = new JPanel(); 
    private JButton bouton1 = new JButton("    Trinom   "); 
    private JButton bouton2 = new JButton("  Tritaille  "); 
    private JButton bouton3 = new JButton("OuvrirFichier"); 


    public Fenetre() { 
        this.setTitle("Accueil");
        Dimension tailleEcran = java.awt.Toolkit.getDefaultToolkit().getScreenSize(); 
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setSize((int) tailleEcran.getWidth(), (int) tailleEcran.getHeight()); 
        pan.add(bouton1);
        pan.add(bouton2);
        pan.add(bouton3); 
        container.setBackground(Color.ORANGE); 
        pan.setBackground(Color.ORANGE);
        container.setLayout(new BorderLayout()); 
        container.add(pan, BorderLayout.EAST); 
        this.setContentPane(container);
        this.setVisible(true);
    }


Comme vous le voyez pour le moment je peux effectivement les placer a droite, mais pas les uns en dessous des autres, et ma fenêtre n'est pas divisée virtuellement en 4, mais en 5 parties de surcroit non égales.... (nord,sud,est,ouest,centre, le centre étant nettement plus gros)


Si vous avez une solution qui me contenterais je serais vraiment ravi !


A voir également:

6 réponses

KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
Modifié par KX le 18/12/2012 à 19:26
Tu devrais imbriquer des GridLayout, un 2x2 principal, puis un 3x1 pour tes boutons :

import java.awt.Color;
import java.awt.GridLayout;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Fenetre extends JFrame 
{
    private static final long serialVersionUID = 1;
    
    public Fenetre()
    {
        setTitle("Accueil");        
        
        setLayout(new GridLayout(2,2));
        JPanel[] panels = new JPanel[4];
        
        for (int i=0; i<4; i++)
        {
            panels[i] = new JPanel();
            panels[i].setBackground(Color.orange);
            add(panels[i]);
        }
        
        panels[1].setLayout(new GridLayout(3,1));
        String[] noms = {"Tri Nom","Tri Taille","Ouvrir Fichier"};        
        JButton[] buttons = new JButton[3];
        
        for (int i=0; i<3; i++)
        {
            buttons[i] = new JButton(noms[i]);
            panels[1].add(buttons[i]);
        }
        
        pack();
        setExtendedState(MAXIMIZED_BOTH);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setVisible(true);
    }
    
    public static void main(String...args)
    {
        new Fenetre();
    }
}
La confiance n'exclut pas le contrôle
3
killdragon Messages postés 33 Date d'inscription lundi 17 décembre 2012 Statut Membre Dernière intervention 1 janvier 2013
18 déc. 2012 à 19:28
Ok merci bien :)

Je n'avais en effet pas pensé a le mettre dans une boucle :)
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
18 déc. 2012 à 19:35
La boucle n'est pas le plus important... D'ailleurs au départ je ne l'avais pas mise.
Il faut juste ne pas oublier de créer des panel vides pour remplir le GridLayout.
0
killdragon Messages postés 33 Date d'inscription lundi 17 décembre 2012 Statut Membre Dernière intervention 1 janvier 2013
19 déc. 2012 à 00:02
Exact, j'avais pensé le faire sans trop savoir comment, je pensais qu'il fallait lui demander de remplir seulement le troisième et de laisser les autres vides, alors qu'il suffisait de lui demander de remplir les autres avec "rien" dedans :)
0
killdragon Messages postés 33 Date d'inscription lundi 17 décembre 2012 Statut Membre Dernière intervention 1 janvier 2013
19 déc. 2012 à 00:10
Je finirais par te poser deux question, n'ayant pas encore vu l'utilité des serialIUD, pourrais-tu m'expliquer cette ligne de code, a savoir ce qu'elle fait comme action ?

private static final long serialVersionUID = 1;


Et si je comprends bien, cette ligne (setExtendedState(MAXIMIZED_BOTH);) permet donc d'afficher la fenêtre a la taille maximale de l'écran ? le BOTH faisant référence aux deux cotés de l'écran donc j'imagine aussi?

Désolé pour ces questions de débutant, ce n'est pas très évident de changer les quelques (mauvaises) habitudes que j'ai prise.

Sinon je te remercie encore une fois, cela m'a beaucoup servi car j'admet avoir eu du mal a comprendre le GridLayout qui me semble nettement plus clair maintenant :)
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
19 déc. 2012 à 13:34
La classe Component implémente l'interface Serializable donc toutes les classes qui héritent de Component (dont JFrame et donc ta classe Fenetre) doivent implémenter l'interface Serializable.
En particulier elles doivent définir le serialVersionUID, mais comme tu ne t'en sers pas la valeur de ce nombre n'a aucune importance, je le rajoutes uniquement pour faire plaisir au compilateur...
Pour plus d'infos je te renvoie à la documentation de cette interface : java.io.Serializable

Pour setExtendedState c'est un peu plus que mettre la fenêtre à la taille maximale, car c'est un vrai agrandissement de la fenêtre. De la manière dont tu le faisais ta fenêtre prenait la taille de l'écran mais débordait sur la barre des tâches et on pouvait quand même "l'agrandir" avec le bouton car la fenêtre était resté dans l'état NORMAL (par défaut). Donc MAXIMIZED_BOTH est effectivement plus approprié, c'est la combinaison de MAXIMIZED_VERT et MAXIMIZED_HORZ. À noter qu'il y a aussi ICONIFIED pour diminuer la fenêtre dans la barre des tâches.
0
killdragon Messages postés 33 Date d'inscription lundi 17 décembre 2012 Statut Membre Dernière intervention 1 janvier 2013
19 déc. 2012 à 16:48
En fait j'ai beau cherche, maintenant que mon écran est donc divisé en 4, les trois boutons y sont effectivement, mais de façon complètement déformée, a savoir beaucoup trop larges.... j'aimerais donc leur donner la taille voulue, a savoir la taille "normale" qu'ils auraient du avoir si je n'avais pas essayé de les placer (donc la taille de 14 caractères + de quoi finir le bouton)

La avec ton code j'ai bien les 3 boutons mais complètement énormes, alors que je voulais a l'intérieur de cette case les mettre en haut a droite...sans pour autant toucher aux 3 autres cases...

Du coup j'ai du reprendre ton code en modifiant simplement le panels[1].setLayout(new GridLayout(3,1)); par panels[1].setLayout(new GridLayout(12,1)); pour pouvoir réduire leur hauteur, mais je n'arrive pas a modifier leur longueur....

En gros je voudrais que ça ressemble a ça : http://imageshack.com/f/nrsanstitrezhj

Malgré mes efforts je n'obtiens pas ça....
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
killdragon Messages postés 33 Date d'inscription lundi 17 décembre 2012 Statut Membre Dernière intervention 1 janvier 2013
19 déc. 2012 à 16:59
Du coup j'ai bien observé qu'il me faudrait un GridBagLayout, sauf que la encore je ne vois pas comment l'utiliser, malgré une bonne lecture de ce site : https://bbclone.developpez.com/fr/java/tutoriels/uiswing/gridbaglayout/

Du coup, pourrais-je encore une fois te demander le code correspondant s'il te plait ?
0
killdragon Messages postés 33 Date d'inscription lundi 17 décembre 2012 Statut Membre Dernière intervention 1 janvier 2013
Modifié par killdragon le 19/12/2012 à 17:13
Disons qu'avec le GridBagLayout il semble possible de diviser encore la fenêtre en 4 parties égales, et même de pouvoir faire la position des boutons que je cherche sauf que lorsque la fenêtre est réduite ou redimensionnée il me semble que cela change la place des boutons...ce que j'aimerais éviter...

J'aimerais donc beaucoup conserver cette mise en place http://imageshack.com/f/nrsanstitrezhj sans qu'elle change suivant les redimensionnements de la fenêtre...
Pour la taille des boutons, celle de "Ouvrir Fichier" est très bien, a savoir sa taille normale lorsque l'on ne place pas a un endroit spécifique les boutons, et si possible qu'ils aient tous la même taille...même après redimensionnement :/ Cette taille la en gros : http://imageshack.com/f/0gsanstitre2vqbj
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
Modifié par KX le 19/12/2012 à 17:29
Les GridBagLayout ne feront pas ce que tu veux, ils vont aussi faire des grosses cases lorsqu'ils auront la place pour le faire. En modifiant légèrement la deuxième boucle je te proposes ceci :

panels[1].setLayout(new BorderLayout());

JPanel tmp = new JPanel();
tmp.setLayout(new BoxLayout(tmp,BoxLayout.Y_AXIS));

for (int i=0; i<3; i++)
{
    buttons[i] = new JButton(noms[i]);
    tmp.add(buttons[i]);
}

panels[1].add(tmp,BorderLayout.EAST);
0
killdragon Messages postés 33 Date d'inscription lundi 17 décembre 2012 Statut Membre Dernière intervention 1 janvier 2013
19 déc. 2012 à 17:34
Oui mais non, cela dénature les 4 cases d'origine....
La on possède donc bien 4 cases sauf que la case de droite est toute petite donc...

De façon très laide j'ai résolu le soucis, je te montre le code et j'aimerais donc que tu me dises ce que tu en penses, comment le modifier pour ne pas réécrire 50 fois la même ligne (puisque les boucles ne veulent pas fonctionner pour écrire cette ligne plusieurs fois étrangement, sans parler du fait que j'insère les boutons aux places stratégiques dont j'ai besoin) et comment le colorer comme je l'ai fait jusqu'a présent ?

 public class Fenetre extends JFrame 
{
    private static final long serialVersionUID = 1;
    
    public Fenetre()
    {
        setTitle("Accueil");        
        
        setLayout(new GridLayout(2,2));
        JPanel[] panels = new JPanel[4];
        
        for (int i=0; i<4; i++)
        {
            panels[i] = new JPanel();
            panels[i].setBackground(Color.orange);
            add(panels[i]);
        }
        
        panels[1].setLayout(new GridLayout(12,5));
        String[] noms = {"     Tri Nom      ","     Tri Taille     ","Ouvrir Fichier"};        
        JButton[] buttons = new JButton[3];
 
        buttons[0] = new JButton(noms[0]);
        buttons[1] = new JButton(noms[1]);
        buttons[2] = new JButton(noms[2]);
        
  
        panels[1].add(new JPanel());
        panels[1].add(new JPanel());
        panels[1].add(new JPanel());
        panels[1].add(new JPanel());
        panels[1].add(buttons[0]); 
        panels[1].add(new JPanel());
        panels[1].add(new JPanel());
        panels[1].add(new JPanel());
        panels[1].add(new JPanel());
        panels[1].add(buttons[1]);
        panels[1].add(new JPanel());
        panels[1].add(new JPanel());
        panels[1].add(new JPanel());
        panels[1].add(new JPanel());
        panels[1].add(buttons[2]);
        panels[1].add(new JPanel());
        panels[1].add(new JPanel());
        panels[1].add(new JPanel());
        panels[1].add(new JPanel());
        panels[1].add(new JPanel());
        panels[1].add(new JPanel());
        panels[1].add(new JPanel());
        panels[1].add(new JPanel());
        panels[1].add(new JPanel());
        panels[1].add(new JPanel());
        panels[1].add(new JPanel());
        panels[1].add(new JPanel());
        panels[1].add(new JPanel());
        panels[1].add(new JPanel());
        panels[1].add(new JPanel());
        panels[1].add(new JPanel());
        panels[1].add(new JPanel());
        panels[1].add(new JPanel());
        panels[1].add(new JPanel());
        panels[1].add(new JPanel());
        panels[1].add(new JPanel());
        panels[1].add(new JPanel());
        panels[1].add(new JPanel());
        panels[1].add(new JPanel());
        panels[1].add(new JPanel());
        panels[1].add(new JPanel());
        panels[1].add(new JPanel());
        panels[1].add(new JPanel());
        panels[1].add(new JPanel());
        panels[1].add(new JPanel());
        panels[1].add(new JPanel());
        panels[1].add(new JPanel());
        panels[1].add(new JPanel());
        panels[1].add(new JPanel());
        panels[1].add(new JPanel());
        panels[1].add(new JPanel());
        panels[1].add(new JPanel());
        panels[1].add(new JPanel());
        panels[1].add(new JPanel());
        panels[1].add(new JPanel());
        
        pack();
        setExtendedState(MAXIMIZED_BOTH);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setVisible(true);
    }
    
0
killdragon Messages postés 33 Date d'inscription lundi 17 décembre 2012 Statut Membre Dernière intervention 1 janvier 2013
19 déc. 2012 à 17:39
Bon j'ai pu les repasser en boucle, cela donne donc maintenant :

 public class Fenetre extends JFrame 
{
    private static final long serialVersionUID = 1;
    
    public Fenetre()
    {
        setTitle("Accueil");        
        
        setLayout(new GridLayout(2,2));
        JPanel[] panels = new JPanel[4];
        
        for (int i=0; i<4; i++)
        {
            panels[i] = new JPanel();
            panels[i].setBackground(Color.orange);
            add(panels[i]);
        }
        
        panels[1].setLayout(new GridLayout(12,5));
        String[] noms = {"     Tri Nom      ","     Tri Taille     ","Ouvrir Fichier"};        
        JButton[] buttons = new JButton[3];
 
        buttons[0] = new JButton(noms[0]);
        buttons[1] = new JButton(noms[1]);
        buttons[2] = new JButton(noms[2]);
        
        for (int j=0; j<4; j++){
        panels[1].add(new JPanel());
        }
        
        panels[1].add(buttons[0]);
        for (int j=0; j<4; j++){
        panels[1].add(new JPanel());
        }
        panels[1].add(buttons[1]);
        for (int j=0; j<4; j++){
        panels[1].add(new JPanel());
        }
        panels[1].add(buttons[2]);
        for (int j=0; j<40; j++){
        panels[1].add(new JPanel());
        }


              
        pack();
        setExtendedState(MAXIMIZED_BOTH);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setVisible(true);
    }



ce qui reste plus lisible, mais je n'arrive pas a colorer le fond d'écran....
Et je ne sais toujours pas si cette solution est viable ou non
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
Modifié par KX le 19/12/2012 à 18:17
"la on possède donc bien 4 cases sauf que la case de droite est toute petite donc..."
Non, tu as toujours tes 4 cases oranges. La "case de droite toute petite" c'est une case en plus !
Et si tu veux la mettre en orange il suffit de rajouter tmp.setBackground(Color.ORANGE);

Ici on voit rapidement comme je le disais que les GridLayout ne font pas ce que tu veux, si au lieu d'avoir ta fenêtre en plein écran, tu la réduis, tes boutons deviennent de plus en plus petits jusqu'à devenir illisibles, alors que quand tu es en plein écran ils sont bien plus grand que leur taille normale (j'ai un grand écran) , en fait ils s'adaptent encore à la taille de la fenêtre ce que ne faisait pas mon code avec les BoxLayout (que l'on pouvait certes amélioré).

PS. J'ai changé les couleurs pour mieux voir, mais c'est juste un commentaire à enlever dans la première boucle pour les remettre en orange :

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;

import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Fenetre extends JFrame 
{
    private static final long serialVersionUID = 1;
    
    public Fenetre()
    {
        setTitle("Accueil");        
        
        setLayout(new GridLayout(2,2));
        JPanel[] panels = new JPanel[4];
        
        for (int i=0; i<4; i++)
        {
            panels[i] = new JPanel();
            panels[i].setBackground(Color.getHSBColor(0.25f*i, 1, 1));
            //panels[i].setBackground(Color.orange);
            add(panels[i]);
        }
        
        String[] noms = {"Tri Nom","Tri Taille","Ouvrir Fichier"};        
        JButton[] buttons = new JButton[3];
        
        JPanel right = new JPanel();
        right.setBackground(Color.orange);
        right.setLayout(new BoxLayout(right,BoxLayout.Y_AXIS));
          
        for (int i=0; i<3; i++)
        {
            buttons[i] = new JButton(noms[i]);
            Dimension dim = buttons[i].getMaximumSize();
            dim.width = Short.MAX_VALUE;
            buttons[i].setMaximumSize(dim);
            right.add(buttons[i]);
        }
          
        panels[1].setLayout(new BorderLayout());
        panels[1].add(right,BorderLayout.EAST);
        
        pack();
        setMinimumSize(getSize());
        
        setExtendedState(MAXIMIZED_BOTH);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setVisible(true);
    }
    
    public static void main(String...args)
    {
        new Fenetre();
    }
}
0
killdragon Messages postés 33 Date d'inscription lundi 17 décembre 2012 Statut Membre Dernière intervention 1 janvier 2013
19 déc. 2012 à 18:42
Ok, j'avais encore une fois mal compris....
Merci, en effet ça marche bien :)
En tout cas je te remercie de t'être occupé d'un débutant pas doué du tout comme moi :)
0