[JFrame] Redimensionnement Fenêtre (GridBag)Layout

Résolu
lac981 Messages postés 14 Date d'inscription jeudi 14 avril 2011 Statut Membre Dernière intervention 31 mai 2011 - 14 avril 2011 à 16:43
 Utilisateur anonyme - 28 oct. 2012 à 22:02
Bonjour,

Je vais essayé d'être le plus explicite possible, mon problème est un peu complexe à faire comprendre même si au final l'idée est simpliste.

I - Mon objectif
II - Ma première ébauche
III - Mes différents problèmes

I - Mon objectif : une fenêtre de ce type.

Le principe serait d'avoir une fenêtre en plein écran, avec un menu dans une jframe principale. En dessous de ce menu trois panels, un à gauche prenant toute la hauteur disponible mais sur 1/3 de la largeur de la fenêtre, puis deux panels prenant chacun 2/3 de largeur et la moitié de la hauteur par défaut.
Et enfin un séparateur entre le panel haut et bas permettant de les redimensionner sur leur hauteur au profit de l'autre (par exemple le panel du haut prend 90% de la hauteur et celui du bas le reste de la hauteur mais leurs largeurs ne changent pas).

Un dessin vaut mieux qu'un long discours : ["http://www.hostingpics.net/viewer.php?id=965689fenetre.png" Fenêtre]

II - Ma première ébauche :

Tout d'abord cette ébauche est le fruit de nombreuse recherche de ma part puisque je ne maitrisais que très peu ces différents éléments(utilisation très simpliste), concernant GridBagLayout, le redimensionnement de fenêtre, les événements windowlistener, windowstatelistener, componentlistener, les autres types de layout possibles dans mon cas, etc . . .

Un petit résumé de ce que j'ai implémenté.
Tout d'abord aucun problème sur le menu. Deuxièmement j'ai mis en place le gridbaglayout (le code suivra) pour mes trois éléments. J'ai ensuite mis à l'initialisation de la fenêtre une dimension pour que chaque panel prennent la place que je souhaitais en effet ils prenaient la plus petite place possible.

Je préfère mettre le code après avoir expliqué mes problèmes.

III - Mes différents problèmes :

Mon problème se trouve dans le gridbaglayout, si un panel vient à contenir un texte trop grand ou autre le gridbag fais n'importe quoi sans mes setMaxsize etc ...

Le problème avec ces fonctions c'est que le redimensionnement se passe très mal, les panels ne gardent plus les proportions que je leur fixe et ce même après l'avoir fixé dans l'événement windowstatechanged. Au final j'ai donc des panels qui partent en vrille quand on redimensionnement.

Concernant la barre de redimensionnement, je ne m'y suis pas encore penché étant donné que je n'arrive même pas à avoir une interface avec mes trois panels bien fixés à leurs positions.

Les parties en relation dans mon code.

public static void main(String[] args) 
{
final App frame = new App();

...

// Fenetre principale
frame.setTitle("LAC 981");

Image icone = Toolkit.getDefaultToolkit().getImage("images/lac.png");

frame.setIconImage(icone);

// full screen
frame.setSize(800, 600); //si la fenêtre est rétrécis elle prendra cette résolution en première valeur

JFrame.setDefaultLookAndFeelDecorated(false);

frame.setExtendedState(JFrame.MAXIMIZED_BOTH);

// barre des menus

....


//mise en place des éléments
GridBagLayout layout = new GridBagLayout();

frame.setLayout(layout);

final JPanel gauche = new JPanel();
gauche.setBorder(BorderFactory.createLineBorder(Color.red));
gauche.setMaximumSize(new Dimension(frame.getToolkit().getScreenSize().width/3,frame.getToolkit().getScreenSize().height));
gauche.setMinimumSize(new Dimension(frame.getToolkit().getScreenSize().width/3,frame.getToolkit().getScreenSize().height));
gauche.setPreferredSize(new Dimension(frame.getToolkit().getScreenSize().width/3,frame.getToolkit().getScreenSize().height));
gauche.add(new JLabel("Gauche"));

final JPanel haut = new JPanel();
haut.setBorder(BorderFactory.createLineBorder(Color.green));
haut.setMaximumSize(new Dimension(2*(frame.getToolkit().getScreenSize().width/3),frame.getToolkit().getScreenSize().height/2));
haut.setMinimumSize(new Dimension(2*(frame.getToolkit().getScreenSize().width/3),frame.getToolkit().getScreenSize().height/2));
haut.setPreferredSize(new Dimension(2*(frame.getToolkit().getScreenSize().width/3),frame.getToolkit().getScreenSize().height/2));
haut.add(new JLabel("Haut"));

final JPanel bas = new JPanel();
bas.setMaximumSize(new Dimension(2*(frame.getToolkit().getScreenSize().width/3),frame.getToolkit().getScreenSize().height/2));
bas.setMinimumSize(new Dimension(2*(frame.getToolkit().getScreenSize().width/3),frame.getToolkit().getScreenSize().height/2));
bas.setPreferredSize(new Dimension(2*(frame.getToolkit().getScreenSize().width/3),frame.getToolkit().getScreenSize().height/2));
bas.setBorder(BorderFactory.createLineBorder(Color.cyan));
bas.add(new JLabel("Bas"));

 GridBagConstraints c5 = new GridBagConstraints();
      c5.gridx = 0;
      c5.gridy = 0;
      c5.gridwidth = 1;
      c5.gridheight = 2;
      c5.anchor = GridBagConstraints.CENTER;
      c5.weightx = 100;
      c5.weighty = 100;
      frame.add(gauche,c5);

      GridBagConstraints c6 = new GridBagConstraints();
      c6.gridx = 1;
      c6.gridy = 0;
      c6.gridwidth = 2;
      c6.gridheight = 1;
      c6.anchor = GridBagConstraints.CENTER;
      c6.weightx = 100;
      c6.weighty = 100;
      frame.add(haut,c6);

      GridBagConstraints c7 = new GridBagConstraints();
      c7.gridx = 1;
      c7.gridy = 1;
      c7.gridwidth = 2;
      c7.gridheight = 1;
      c7.fill = GridBagConstraints.CENTER;
      c7.weightx = 100;
      c7.weighty = 100;
      frame.add(bas,c7);

    //redimensionnement
    frame.addWindowStateListener(new WindowAdapter() 
      	{   
    	  	@Override
public void windowStateChanged(WindowEvent e) 
{
gauche.setMaximumSize(new Dimension(frame.getWidth()/3,frame.getHeight()));
gauche.setMinimumSize(new Dimension(frame.getWidth()/3,frame.getHeight()));
gauche.setPreferredSize(new Dimension(frame.getWidth()/3,frame.getHeight()));
haut.setMaximumSize(new Dimension(2*(frame.getWidth()/3),frame.getHeight()/2));
haut.setMinimumSize(new Dimension(2*(frame.getWidth()/3),frame.getHeight()/2));
haut.setPreferredSize(new Dimension(2*(frame.getWidth()/3),frame.getHeight()/2));
bas.setMaximumSize(new Dimension(2*(frame.getWidth()/3),frame.getHeight()/2));
bas.setMinimumSize(new Dimension(2*(frame.getWidth()/3),frame.getHeight()/2));
bas.setPreferredSize(new Dimension(2*(frame.getWidth()/3),frame.getHeight()/2));
}
      	});
    
    //action fermeture
...
    	

frame.validate();

frame.setVisible(true);

}


Alors je me tourne vers vous :

Mon choix de layout est - il mauvais ?

Je ne trouve pas de meilleur moyen de gérer les redimensionnements, en avez vous un ?

Avez vous tous simplement une meilleur piste pour moi ou une idée me permettant d'obtenir ma fenêtre ?

Je suis prêt à répondre à toutes vos questions.

N'hésitez pas à proposer vos idées !
Merci

6 réponses

Utilisateur anonyme
14 avril 2011 à 22:24
Salut,

Chapeau pour la rédaction, on voit rarement ça.

Si je peux me permettre, allège ton main car tu as - pour ma part - beaucoup trop de code dedans. Essaye de déplacer ton ça dans le code de ta fenêtre ou ailleurs car tu ne te facilites pas la tâche. Aussi, le lien pour ta fenêtre de marche pas (merci 404 ).

Tu entends quoi par "texte trop grand" ? Un police trop importante ou une ligne de texte trop longue ?

Sinon, peut être les FlowsLayout mais j'en doute...

-- Pylouq : jongleur de clavier AZERTY et de clavier QWERTZ --
3
Utilisateur anonyme
15 avril 2011 à 17:34
A la limite si ton texte est trop grand, jette un coup d’œil du côté des JScrollPane.
SI jamais le contenu est trop important, des barres de défilements entrent en action. Ça ne coûte rien d'essayer


-- Pylouq : jongleur de clavier AZERTY et de clavier QWERTZ --
3
lac981 Messages postés 14 Date d'inscription jeudi 14 avril 2011 Statut Membre Dernière intervention 31 mai 2011 1
15 avril 2011 à 08:44
Salut et merci.

Je pense en effet que je vais alléger le main (en fait c'est bien pire que ça ^^), concernant la fenêtre : re-upload.

Alors quand je parle de texte trop grand je veux dire texte qui ne revient pas à la ligne et qui emmène avec lui le bord du panel, ainsi le panel ne respecte plus les proportions décidées dans mon layout.

Je vais regarder pour flowlayout, je vous tiens au courant.
0
lac981 Messages postés 14 Date d'inscription jeudi 14 avril 2011 Statut Membre Dernière intervention 31 mai 2011 1
19 avril 2011 à 14:16
Bonjour,

Et bien merci, ta solution fonctionne parfaitement.

La solution est donc : flowlayout + l'évènement componentResized

Merci et à bientôt.
0

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

Posez votre question
willimartial
23 oct. 2012 à 10:23
je ne sais pas is je suis tomber dabns le bon forum je voudrais par exemple dans l'utilisation d'un JTree je voudrais savoir comment
si par exemple on une racine quincaillerie
dans quincailleir on a gestion client et dans gestion client on a enreigistre clien je voudrais savoir comment on fait pour faire apparaitre le menu d'enregsitrement des client si lutilisateur clic sur enregsitrer client

merci pour votre aide
0
Utilisateur anonyme
28 oct. 2012 à 22:02
Plusieurs choses :
- évite de faire des ups de sujets qui datent beaucoup, car celui-là a été résolu il y a plus d'un an !
- ensuite, va faire un nouveau sujet sur le forum plutôt que d'en squatter un autre
- un peu de politesse n'a jamais tuer personne
- bref, va voir le Règlementpour information

--
Pylouq
Heureux sont ceux qui lisent le Réglement, ils ne finiront peut-être pas au bûcher.
0
Rejoignez-nous