OVH Cloud OVH Cloud

FlowLayout

2 réponses
Avatar
captainpaf
Bonjour,

j'ai un souci avec l'utilisation des FlowLayout. Je voudrais créer une
fenêtre contenant 3 lignes :
- la première ligne affichera une liste de boutons. Je voudrais que ces
boutons puissent être aligné comme le fait un flowlayout.
- la deuxième affichera 2 boutons. Je voudrais que ceux là restent sur
une ligne et soient centrés à l'écran.
- la 3ème affichera un composant qui doit être centré à l'écran (une
JListe par exemple).

Voiçi le code que j'ai fais et qui me pose un souci avec la première
ligne de boutons. Le problème est que ces boutons restent alignés sur
une et une seule ligne.

Avez vous une idée de ce qui cloche ? Peut on éventuellement faire plus
simple ?

<code>
import java.awt.*;
import java.util.ArrayList;
import java.util.Iterator;
import javax.swing.*;

/**
* test du flow layout
*
*@author captainpaf
*@created 18 mai 2004
*/
public class TestLayout extends JFrame
{
/**
* Gets the flowButtons attribute of the TestLayout object
*
*@return The flowButtons value
*/
private JPanel getFlowButtons()
{
JPanel panel = new JPanel(new FlowLayout());
//panel.setSize(200, 200);
for (int i = 0; i < 16; i++)
{
panel.add(new JButton("Button " + (i + 1)));
}
return panel;
}


/**
* Gets the fixedButtons attribute of the TestLayout object
*
*@return The fixedButtons value
*/
private JPanel getFixedButtons()
{
JPanel panel = new JPanel(new GridBagLayout());
GridBagConstraints constraints = new GridBagConstraints();
constraints.gridx = 0;
constraints.gridy = 0;
constraints.gridwidth = 1;
constraints.gridheight = 1;
constraints.weightx = 0.0;
constraints.weighty = 0.0;
constraints.anchor = GridBagConstraints.EAST;
constraints.fill = GridBagConstraints.NONE;
constraints.ipadx = 0;
constraints.ipady = 0;
constraints.insets = new Insets(2, 2, 2, 2);
panel.add(new JButton("Fixed 1"), constraints);
constraints.gridx = 1;
constraints.anchor = GridBagConstraints.WEST;
panel.add(new JButton("Fixed 2"), constraints);
return panel;
}


/**
* Gets the mainPoulePanel attribute of the TestLayout object
*
*@return The mainPoulePanel value
*/
private JPanel getMainPoulePanel()
{
JPanel panel = new JPanel(new GridBagLayout());
GridBagConstraints constraints = new GridBagConstraints();
constraints.gridx = 0;
constraints.gridy = 0;
constraints.gridwidth = 1;
constraints.gridheight = 1;
constraints.weightx = 0.0;
constraints.weighty = 1.0;
constraints.anchor = GridBagConstraints.NORTH;
constraints.fill = GridBagConstraints.VERTICAL;
constraints.ipadx = 0;
constraints.ipady = 0;
constraints.insets = new Insets(2, 2, 2, 2);
panel.add(getFlowButtons(), constraints);
constraints.anchor = GridBagConstraints.CENTER;
constraints.fill = GridBagConstraints.NONE;
constraints.gridy = 1;
constraints.weighty = 0.0;
constraints.weightx = 0.0;
panel.add(getFixedButtons(), constraints);
constraints.gridy = 2;
String[] data = {"one", "two", "three", "four"};
JList dataList = new JList(data);
panel.add(dataList, constraints);
return panel;
}


/**
* constructeur par défaut
*/
public TestLayout()
{
setTitle("TestLayout");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
setSize(300, 300);
getContentPane().add(getMainPoulePanel());
}


/**
* The main program for the TestLayout class
*
*@param args The command line arguments
*/
public static void main(String[] args)
{
TestLayout test = new TestLayout();
}
}
</code>

2 réponses

Avatar
jocelyn
Salut,

Quand tu dis que tu veux que tes boutons du panel flowButtons s'affichent
sur une ligne,
tu parles d'une ligne 'logique' ou 'reelle' ? Autrement dit tu veux que tes
boutons soient
réellement tous sur la meme ligne à l'ecran, ce qui me parait difficile vu
leur nombre, ou
bien il est possible de passer à la ligne suivante quand il n'y a + de place
?
Dans le 2eme cas de figure, voici ce qui cloche je pense:

Tu ajoutes ton panel flowButtons au panel principal en utilisant une
contrainte qui a un poids de
0 en x (methode getMainPoulePanel()). La consequence est que le panel
flowButtons ne peux
pas revenir 'à la ligne' quand il n'a + de place pour ses boutons, il
n'affiche que ceux qu'il peut.
Si tu passes ce poids a 1 les boutons s'afficheront tous, sur autant de
lignes que necessaire.

PS: ta frame est trop petite en hauteur pour le passage a la ligne. Pour
voir le resultat du
chgt que je propose, il faut soit la redimensionner a la mano, soit la faire
un peu + grande.

--
Celui qui lutte contre des monstres doit prendre garde, dans le combat, à ne
pas devenir un monstre lui-même
Avatar
captainpaf
Salut et merci pour ta réponse,

c'étais bien le deuxième cas que je voulais faire. Je ne pensais pas
que le poids en x pouvais avoir une influence sur le FlowLayout. En
plus, j'avais un ScrollPane qui foutais la merde.
Maintenant ça marche bien,
merciu encore.


Salut,

Quand tu dis que tu veux que tes boutons du panel flowButtons s'affichent
sur une ligne,
tu parles d'une ligne 'logique' ou 'reelle' ? Autrement dit tu veux que tes
boutons soient
réellement tous sur la meme ligne à l'ecran, ce qui me parait difficile vu
leur nombre, ou
bien il est possible de passer à la ligne suivante quand il n'y a + de place
?
Dans le 2eme cas de figure, voici ce qui cloche je pense:

Tu ajoutes ton panel flowButtons au panel principal en utilisant une
contrainte qui a un poids de
0 en x (methode getMainPoulePanel()). La consequence est que le panel
flowButtons ne peux
pas revenir 'à la ligne' quand il n'a + de place pour ses boutons, il
n'affiche que ceux qu'il peut.
Si tu passes ce poids a 1 les boutons s'afficheront tous, sur autant de
lignes que necessaire.

PS: ta frame est trop petite en hauteur pour le passage a la ligne. Pour
voir le resultat du
chgt que je propose, il faut soit la redimensionner a la mano, soit la faire
un peu + grande.