Java - Peleando con GridBagLayout

 
Vista:
Imágen de perfil de Kabuto
Val: 3.428
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Peleando con GridBagLayout

Publicado por Kabuto (1381 intervenciones) el 08/08/2019 11:43:19
Hola.

Estoy practicando con un layout que nunca uso, el GridBagLayout.

Quiero colocar 6 botones en esta disposición:

boceto


Mi código es este, pero no consigo que Botón 3 ocupe 4 celdas ni que Botón 6 ocupe 2
¿Que hago mal?
En principio las celdas no tienen que crecer, por eso no uso atributos weightx y weighty.
Mi idea es que las celdas midan igual, pero que algunos botones ocupen más de una celda.

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
public class GridBag extends JFrame{
 
	public GridBag() {
		setLayout(new GridBagLayout());
 
		GridBagConstraints restricciones = new GridBagConstraints();
		restricciones.gridx = 0;
		restricciones.gridy = 0;
		add(new JButton("Botón 1"), restricciones);
		restricciones.gridx = 3;
		restricciones.gridy = 0;
		add(new JButton("Botón 2"), restricciones);
		restricciones.gridx = 1;
		restricciones.gridy = 1;
		restricciones.gridheight = 2; //Dimensiones para Botón 3
		restricciones.gridwidth = 2;
		restricciones.fill = GridBagConstraints.BOTH;
		add(new JButton("Botón 3"), restricciones);
		restricciones.gridx = 0;
		restricciones.gridy = 3;
		restricciones.gridheight = 1; //Para Botón 4 revertimos las dimensiones anteriores
		restricciones.gridwidth = 1;
		add(new JButton("Botón 4"), restricciones);
		restricciones.gridx = 1;
		restricciones.gridy = 3;
		add(new JButton("Botón 5"), restricciones);
		restricciones.gridx = 2;
		restricciones.gridy = 3;
		restricciones.gridwidth = 2; //Botón 6 solo modificamos el ancho
		restricciones.fill = GridBagConstraints.HORIZONTAL;
		add(new JButton("Botón 6"), restricciones);
 
		setTitle("Ejemplo GridBagLayout");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		pack();
		setResizable(false);
		setLocationRelativeTo(null);
		setVisible(true);
	}
 
	public static void main(String[] args) {
		SwingUtilities.invokeLater(new Runnable() {
 
			@Override
			public void run() {
				new GridBag();
			}
		});
	}
}
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Peleando con GridBagLayout

Publicado por Tom (1831 intervenciones) el 08/08/2019 12:10:35
Ponle weightx y weighty a 1.0 para probar, la primera vez, tras crear restricciones.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Peleando con GridBagLayout

Publicado por Tom (1831 intervenciones) el 08/08/2019 15:18:58
Además, creo que malinterpretas algo. No todas las filas tienen la misma altura ni todas las columnas la misma anchura; Estos valores se calculan en base al preferred size de los componentes insertados.

En tu caso concreto, la fila 1 tendrá de alto el preferred size de boton 3 , pero la fila 2 tendrá una altura de 0 (o un valor pequeño) ya que no hay ningún otro componente en ella.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Kabuto
Val: 3.428
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Peleando con GridBagLayout

Publicado por Kabuto (1381 intervenciones) el 09/08/2019 00:46:51
Gracias Tom.

Ya probé a jugar con el weightx y weighty, pero no sirvió.

Sobre la fila 2, ya me dí cuenta de que aparentemente no está y probé a colocar otro botón, en gridx= 0 / gridy = 2, para ver si así al menos conseguí tener 4 filas.
Pero no, el nuevo botón se me pone a la misma altura que "Botón 3", a pesar de que este está en gridy = 1.

Es cierto que hay algo que no interpreto bien o que se me escapa.
Fíjate que primero empecé poniendo solo las constraints para las posiciones de las celdas. Aquí ya noté que me "faltaba" una fila, pero al menos tenía las 4 columnas.

9905547gridbag2

Supuse que la fila faltante iba a aparecer en cuanto añadiese constraints para indicar que "Boton 3" debía ocupar dos celdas de ancho y otras dos de alto, es decir, 4 celdas.

Pues.. no solo no apareció la tercera fila que me faltaba, sino que lo que pasó es que desapareció la tercera columna xD

9905548gridbag3

Pensé, quizás Boton 3 está ocupando las 4 celdas, pero estas se han reducido al tamaño del botón, en lugar de crecer el botón para adaptarse al tamaño de las celdas..., pero me pareció un poco absurdo.
Ahí ya empecé a fruncir el ceño y comencé a jugar con otros constraints para hacer que se estiren las celdas (aunque no quiero que se estiren), especificar el anchor(anclado) del Botón 3..
Pero nada....

Seguiré dándole vueltas.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Peleando con GridBagLayout

Publicado por Tom (1831 intervenciones) el 09/08/2019 09:02:00
Insisto en que tu problema son las filas y columnas vacías.
Prueba esto que mete botones de relleno:


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
TestGrid() {
    setLayout(new GridBagLayout());
    GridBagConstraints ct = new GridBagConstraints();
 
    ct.gridx = 0;
    ct.gridy = 0;
    ct.fill = GridBagConstraints.BOTH;
    add(new JButton("Button 1"), ct);
 
    ct.gridx = 3;
    ct.gridy = 0;
    add(new JButton("Button 2"), ct);
 
    ct.gridx = 1;
    ct.gridy = 1;
    ct.gridwidth = 2;
    ct.gridheight = 2;
    add(new JButton("Button 3"), ct);
 
    ct.gridx = 0;
    ct.gridy = 3;
    ct.gridwidth = 1;
    ct.gridheight = 1;
    add(new JButton("Button 4"), ct);
 
    ct.gridx = 1;
    ct.gridy = 3;
    add(new JButton("Button 5"), ct);
 
    ct.gridx = 2;
    ct.gridy = 3;
    ct.gridwidth = 2;
    add(new JButton("Button 6"), ct);
 
    ct.gridx = 2;
    ct.gridy = 0;
    ct.gridwidth = 1;
    add(new JButton("Filler"), ct);
 
    ct.gridx = 0;
    ct.gridy = 2;
    add(new JButton("Filler"), ct);
 
    ct.gridx = 3;
    ct.gridy = 1;
    add(new JButton("Filler"), ct);
 
    pack();
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar