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 : 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.

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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
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