Java - Crear paneles y botones automáticamente

 
Vista:
sin imagen de perfil
Val: 9
Ha aumentado su posición en 5 puestos en Java (en relación al último mes)
Gráfica de Java

Crear paneles y botones automáticamente

Publicado por Isidro (2 intervenciones) el 16/03/2021 08:16:11
Buenas, tengo una duda y es que no se la forma adecuada de crear arrays de paneles y botones automáticamente, mediante código, para que queden situados de la forma que quiero.
Adjunto imagen del resultado deseado.

bitmap-854
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
-1
Responder
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

Crear paneles y botones automáticamente

Publicado por Kabuto (1381 intervenciones) el 17/03/2021 01:02:35
Con la programación orientada a objetos, puedes modelar cualquier cosa escribiendo el código una vez, para luego replicarlo tantas veces como necesites.

¿Esto que es?

imagen_2021-03-17_001920

Un panel con 4 botones verticales.
Pues puedes crear una clase que herede de JPanel (por tanto, será un JPanel).
con un layout que coloque elementos en vertical, por ejemplo, un BoxLayout configurado para el eje Y(vertical)
y que tenga 4 botones.

Incluso, si no quieres limitarte a solo 4 botones, puedes crear un arreglo de JButton e indicar mediante el constructor de la clase cuántos elementos ha de tener ese arreglo.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class PanelBotones extends JPanel {
 
		JButton[] botonera;
 
		public PanelBotones(int numBotones) {
 
			botonera = new JButton[numBotones];
 
			setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
			for (int n= 0; n < numBotones; n++) {
				botonera[n] = new JButton("Boton");
				add(botonera[n]);
			}
 
			setBackground(new Color(180, 254, 204));
			setBorder(BorderFactory.createCompoundBorder(
					BorderFactory.createEmptyBorder(10, 10, 10, 10),
					BorderFactory.createLoweredSoftBevelBorder()));
		}
	}

Opcionalmente añadimos color de fondo y unos bordes.

Bien, ¿qué es esto?

imagen_2021-03-17_002338

Un panel, que contiene los paneles de botones que hemos modelado en la clase anterior.
Este panel coloca esos paneles de botones, de forma horizontal, pegados a la izquierda y sin repartir las dimensiones para llenar todo el espacio disponible.

De nuevo, podemos crear otra clase que herede JPanel , a la cuál podamos añadirle "paneles de botones" y que los distribuya de esa manera.
Para distribuir en horizontal, podemos usar por ejemplo, un FlowLayout especificándole que ha de hacer que los elementos que le añadamos, floten hacia la izquierda.
Si no especificamos nada, "flotarían" desde el centro.
Y ya de paso, opcionalmente también especificamos algún color y bordes.
Es una clase tan sencilla como esta:
1
2
3
4
5
6
7
8
9
10
11
12
13
class PanelConArrays extends JPanel {
 
		public PanelConArrays() {
 
			setLayout(new FlowLayout(FlowLayout.LEFT));
 
			setBackground(new Color(175, 221, 135));
			setBorder(BorderFactory.createCompoundBorder(
					BorderFactory.createEmptyBorder(15, 15, 15, 15),
					BorderFactory.createRaisedSoftBevelBorder()));
		}
 
	}


Por último, ¿qué es esto?

60505b2fe01fe-bitmap-854

Un JFrame, con 15 "paneles de arrays de botones", cada uno con 4 botones.
Estos paneles se distribuyen en tres filas
La primera es un "panel de arrays" con 4 arrays de botones.
La segunda fila son "dos paneles de arrays", uno con 4 y otros con 3.
La tercera fila es igual que la primera.

Pues crearemos un JFrame, con un arreglo de 15 "arrays de botones" (la primera clase que hemos escrito)

Crearemos 4 "paneles con arrays", a cada uno le añadiremos 4 "arrays de botones", menos a uno que solo tendrá 3.

Con un BoxLayout vertical colocaremos los "paneles con arrays".
Los de la segunda fila, que son dos, irán dentro de un JPanel para agruparlos y que vayan juntos en la misma fila. Este JPanel le podemos poner un GridLayout, este layout asegurará que ambos paneles tengan la misma dimensión, a pesar de que uno tendrá 4 arrays de botones y el otro solo 3.

En fin, el código final al completo podría ser este:
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
public class ArraysPaneles extends JFrame{
 
	PanelBotones[] arrayBotones;
 
	public ArraysPaneles() {
		arrayBotones = new PanelBotones[15];
		for (int n = 0; n < 15; n++)
			arrayBotones[n] = new PanelBotones(4);
 
 
		setLayout(new BoxLayout(getContentPane(), BoxLayout.Y_AXIS));
 
		PanelConArrays panel1 = new PanelConArrays();
		for (int n = 0; n < 4; n++)
			panel1.add(arrayBotones[n]);
		add(panel1);
 
		PanelConArrays panel2 = new PanelConArrays();
		for (int n = 4; n < 8; n++)
			panel2.add(arrayBotones[n]);
		PanelConArrays panel3 = new PanelConArrays();
		for (int n = 8; n < 11; n++)
			panel3.add(arrayBotones[n]);
		JPanel panelDoble = new JPanel();
		panelDoble.setLayout(new GridLayout(1,2));
		panelDoble.add(panel2);
		panelDoble.add(panel3);
		add(panelDoble);
 
		PanelConArrays panel4 = new PanelConArrays();
		for (int n = 11; n < 15; n++)
			panel4.add(arrayBotones[n]);
		add(panel4);
 
		setTitle("Prueba arrays paneles");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setSize(1024, 768);
		setLocationRelativeTo(null);
		setVisible(true);
 
	}
 
 
	class PanelBotones extends JPanel {
 
		JButton[] botonera;
 
		public PanelBotones(int numBotones) {
 
			botonera = new JButton[numBotones];
 
			setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
			for (int n= 0; n < numBotones; n++) {
				botonera[n] = new JButton("Boton");
				add(botonera[n]);
			}
 
			setBackground(new Color(180, 254, 204));
			setBorder(BorderFactory.createCompoundBorder(
					BorderFactory.createEmptyBorder(10, 10, 10, 10),
					BorderFactory.createLoweredSoftBevelBorder()));
		}
	}
 
	class PanelConArrays extends JPanel {
 
		public PanelConArrays() {
 
			setLayout(new FlowLayout(FlowLayout.LEFT));
 
			setBackground(new Color(175, 221, 135));
			setBorder(BorderFactory.createCompoundBorder(
					BorderFactory.createEmptyBorder(15, 15, 15, 15),
					BorderFactory.createRaisedSoftBevelBorder()));
		}
 
	}
 
	public static void main(String[] args) {
		SwingUtilities.invokeLater(new Runnable() {
			@Override
			public void run() {
				new ArraysPaneles();
			}
		});
	}
 
}

Lo cuál nos da una interfaz con una distribución muy similar a lo que buscabas:

imagen_2021-03-17_005318


Ya luego hay otros aspectos que habría que tener en cuenta.
Por ejemplo, se supone que cada botón tendrá una acción (ActionListener).
¿Cómo se las asignaremos?
Pues la clase PanelBotones, sus arreglos de JButton no son privados, así que se puede acceder a ellos para asignarles acciones, cambiar el texto que muestran etc...

Otra opción sería declarar por separado esos JButton, como atributo de JFrame, en un arreglo de 60 JButton (15 arrays de botones X 4 botones de cada uno = 60 botones)
Y modificar la clase PanelBotones para que en lugar de crear ella su propio arreglo de botones, que reciba por constructor un arreglo con los botones que tiene que colocar.

Así ese arreglo de 60 botones, una vez declarados, creados, configurados y listos para ser usados.... se podrían "trocear" en pequeños arreglos de 3/4 botones y hacérselos llegar a la clase PanelBotones por constructor para que los coloque.

Con la programación orientada a objetos, hay muchas posibilidades y formas de hacer las cosas, ya es escoger la que nos parezca más cómoda según cada caso.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 9
Ha aumentado su posición en 5 puestos en Java (en relación al último mes)
Gráfica de Java

Crear paneles y botones automáticamente

Publicado por Isidro (2 intervenciones) el 18/03/2021 12:05:23
Perfecto.
Muchas gracias por tu aportación.
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