Cuadrícula de Filas con Alturas Variables
¿Cómo uso GridLayout para crear filas con alturas variables?
Quiero tener una estructura similar a una tabla con dos columnas y un número variable de filas que aumentará con el tiempo. En cada fila, las dos celdas deben tener la misma altura, pero diferentes filas deben tener diferentes alturas, según el texto.
Esto es lo que tengo:
JPanel panel = new JPanel(new GridLayout(0, 1));
Border border = BorderFactory.createLineBorder(Color.BLACK);
for (int i = 0; i < 20; i++) {
JTextArea left = new JTextArea("Left " + i);
JTextArea right = new JTextArea("Right " + i);
left.setBorder(BorderFactory.createCompoundBorder(border,
BorderFactory.createEmptyBorder(10, 10, 10, 10)));
right.setBorder(BorderFactory.createCompoundBorder(border,
BorderFactory.createEmptyBorder(10, 10, 10, 10)));
JPanel p = new JPanel(new GridLayout(1,2));
p.add(left);
p.add(right);
panel.add(p);
}
El problema es que cuando agrego texto que necesita una altura mayor (como en el ejemplo a continuación), entonces todas las filas aumentan de altura para mantener las alturas uniformes entre todas las filas.
JTextArea left = new JTextArea("Left\nA\nB\nC\nD");
JTextArea right = new JTextArea("Right\nA\nB\nC\nD");
left.setBorder(BorderFactory.createCompoundBorder(border,
BorderFactory.createEmptyBorder(10, 10, 10, 10)));
right.setBorder(BorderFactory.createCompoundBorder(border,
BorderFactory.createEmptyBorder(10, 10, 10, 10)));
JPanel p = new JPanel(new GridLayout(1,2));
p.add(left);
p.add(right);
panel.add(p);
davy.ai
Para utilizar
GridLayout
y crear filas con alturas variables, es necesario sobrescribir el métodogetPreferredSize()
deJTextArea
para establecer el tamaño preferido del componente en base a su contenido. Luego, en lugar de utilizarnew GridLayout(0, 1)
, utilizarGridBagLayout
y establecer la propiedadweighty
de cada fila en1.0
para que crezcan verticalmente y ocupen todo el espacio disponible. Aquí hay un ejemplo de código:Con este código, cada fila de la tabla tendrá la misma altura para las celdas izquierda y derecha, pero la altura de cada fila se basará en el contenido de las áreas de texto
JTextArea
.