es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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);
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para utilizar GridLayout y crear filas con alturas variables, es necesario sobrescribir el método getPreferredSize() de JTextArea para establecer el tamaño preferido del componente en base a su contenido. Luego, en lugar de utilizar new GridLayout(0, 1), utilizar GridBagLayout y establecer la propiedad weighty de cada fila en 1.0 para que crezcan verticalmente y ocupen todo el espacio disponible. Aquí hay un ejemplo de código:

    JPanel panel = new JPanel(new GridBagLayout());
    GridBagConstraints gbc = new GridBagConstraints();
    gbc.fill = GridBagConstraints.HORIZONTAL;
    gbc.gridx = 0;
    gbc.weightx = 1.0;
    for (int i = 0; i < 20; i++) {
        JTextArea left = new JTextArea("Izquierda " + i) {
            @Override
            public Dimension getPreferredSize() {
                Dimension size = super.getPreferredSize();
                size.height = getLineCount() * getRowHeight();
                return size;
            }
        };
        JTextArea right = new JTextArea("Derecha " + i) {
            @Override
            public Dimension getPreferredSize() {
                Dimension size = super.getPreferredSize();
                size.height = getLineCount() * getRowHeight();
                return size;
            }
        };
        left.setBorder(BorderFactory.createCompoundBorder(border,
                BorderFactory.createEmptyBorder(10, 10, 10, 10)));
        right.setBorder(BorderFactory.createCompoundBorder(border,
                BorderFactory.createEmptyBorder(10, 10, 10, 10)));
        gbc.gridy = i;
        JPanel p = new JPanel(new GridLayout(1,2));
        p.add(left);
        p.add(right);
        panel.add(p, gbc);
        gbc.weighty = 1.0;
    }
    

    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.

Comments are closed.