Java - layout apropiado para un formulario

 
Vista:
Imágen de perfil de Carmen
Val: 6
Ha aumentado su posición en 21 puestos en Java (en relación al último mes)
Gráfica de Java

layout apropiado para un formulario

Publicado por Carmen (2 intervenciones) el 07/02/2021 00:06:06
Buenas Tardes.
De antemano agradezco su ayuda para solucionar el problema que se me presenta en estos momentos con la creación de un formulario en java.
Tengo un panel solo para este formulario que esta formado por varios JLabel que cuentan con su correspondiente JTextField. Mi problema es que cuando ejecuto el programa, estos componentes me salen desordenados, yo quiero que queden alineados todos en dos columnas. Adjunto imagen.
Feliz tarde.
Imagen1
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
Imágen de perfil de Kabuto
Val: 3.302
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

layout apropiado para un formulario

Publicado por Kabuto (914 intervenciones) el 07/02/2021 02:36:52
Hola.
Una forma de conseguirlo es encerrar cada uno de esos JLabel y su compañero JTextField dentro de un JPanel.
Luego se pueden maquetar dentro de otro JPanel que albergue todos esos paneles, usando un GridLayout.
Como son 12 datos los que pides, pues podemos hacer una "grilla" de 6 filas y 2 columnas.

Para no tener que hacer escribir 12 JPanel, y a cada uno de estos 12 JPanel añadirle un JLabel y un JTextfield, puedes crear una clase dentro de la clase principal, que herede de JPanel y tenga dos atributos, un JLabel y un JTextField.

Por constructor le puedes pasar el texto que quieres que tenga el JPanel. Y además establecer tamaños de fuente o lo que quieras.
De esta manera todo esto lo tendrás que escribir una sola vez, ya luego simplemente crear 12 objetos de esta clase y añadirlos a la "grilla" de 6x2.

Para asegurarte de que luego al construir la "grilla" los campos de texto queden bien alineados, lo mejor es hacer que esos paneles tenga un FlowLayout hacia la derecha, así todos los campos de texto quedarán alineados unos debajo de otros.

He escrito un pequeño ejemplo replicando una interfaz similar a la que propones.

imagen_2021-02-07_023513


Aquí te dejo el código. Si hay algo que no entiendes o te genera dudas, por favor, no dudes en preguntar. Un saludo.

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
public class Formulario extends JFrame{
 
	private PanelLabelConCampo panelNombre = new PanelLabelConCampo("Nombre");
	private PanelLabelConCampo panelFecha = new PanelLabelConCampo("Fecha de Nacimiento");
	private PanelLabelConCampo panelEdad = new PanelLabelConCampo("Edad");
	private PanelLabelConCampo panelTipoDoc = new PanelLabelConCampo("Tipo de Documento");
	private PanelLabelConCampo panelNumeroDoc = new PanelLabelConCampo("Número de Documento");
	private PanelLabelConCampo panelDireccion = new PanelLabelConCampo("Dirección");
	private PanelLabelConCampo panelTelefono = new PanelLabelConCampo("Teléfono");
	private PanelLabelConCampo panelCelular = new PanelLabelConCampo("Celular");
	private PanelLabelConCampo panelCorreo = new PanelLabelConCampo("Correo Electrónico");
	private PanelLabelConCampo panelEps = new PanelLabelConCampo("Eps");
	private PanelLabelConCampo panelTipoSangre = new PanelLabelConCampo("Tipo de Sangre");
	private PanelLabelConCampo panelEstado = new PanelLabelConCampo("Estado");
 
	public Formulario() {
 
		setLayout(new BorderLayout());
 
		add(new PanelTitulo(), BorderLayout.NORTH);
		add(new PanelFormulario(), BorderLayout.CENTER);
 
		setTitle("Gestion Colegio");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		pack();
		setLocationRelativeTo(null);
		setVisible(true);
	}
 
	private class PanelTitulo extends JPanel {
 
		public PanelTitulo() {
			JLabel titulo = new JLabel("REGISTRO DE ESTUDIANTES");
			titulo.setFont(new Font("Verdana", Font.BOLD, 28));
			add(titulo);
			setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));
			setBackground(new Color(51, 172, 255));
		}
	}
 
	private class PanelFormulario extends JPanel {
 
		public PanelFormulario() {
			//Establecemos layout
			setLayout(new GridLayout(6, 2));//Grilla de 6 filas y 2 columnas
			//Añadimos los paneles de campos de texto
			add(panelNombre);
			add(panelFecha);
			add(panelEdad);
			add(panelTipoDoc);
			add(panelNumeroDoc);
			add(panelDireccion);
			add(panelTelefono);
			add(panelCelular);
			add(panelCorreo);
			add(panelEps);
			add(panelTipoSangre);
			add(panelEstado);
			//Construimos borde
			TitledBorder bordeTitulo = new TitledBorder("Datos del Estudiante");
			bordeTitulo.setTitleFont(new Font("Verdana", Font.BOLD, 26));
			setBorder(BorderFactory.createCompoundBorder(
					bordeTitulo,
					BorderFactory.createEmptyBorder(25, 30, 25, 30)));
		}
	}
 
	/**
	 * Clase que modela un panel con una etiqueta
	 * y un campo de texto.
	 */
	private class PanelLabelConCampo extends JPanel {
		JLabel label;
		JTextField campo;
 
		public PanelLabelConCampo(String textoEtiqueta) {
			/*
			 * Hacemos que los componentes "floten" hacia la derecha
			 * para que cuando construyamos un formulario con varios
			 * paneles como este, los campos de texto quedarán alineados
			 * unos debajo de otros.
			 */
			setLayout(new FlowLayout(FlowLayout.RIGHT));
			label = new JLabel(textoEtiqueta);
			campo = new JTextField(12);
			add(label);
			add(campo);
		}
 
	}
 
	public static void main(String[] args) {
		SwingUtilities.invokeLater(new Runnable() {
			@Override
			public void run() {
				new Formulario();
			}
		});
	}
}
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
Imágen de perfil de Carmen
Val: 6
Ha aumentado su posición en 21 puestos en Java (en relación al último mes)
Gráfica de Java

layout apropiado para un formulario

Publicado por Carmen (2 intervenciones) el 07/02/2021 05:30:01
excelente...te agradezco infinitamente por haberte tomado el tiempo y la molestia de responderme tan asertivamente, entendi tu sujerencia.
feliz noche, y nuevamente mil gracias.
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