JScrollPane que contiene JPanel que contiene paneles más pequeños que se generan dinámicamente y aparecen vacíos

Tengo un JScrollPane, llámalo jsp. Quiero llenar este panel de desplazamiento con una lista de cadenas generadas dinámicamente. Para hacer esto, estoy creando un 'panel' JPanel e insertándolo, usando un GridBagLayout (para una lista solo vertical), varios MiniGUI que extienden JPanel (formateados como quiero que se vea la salida).

Cuando cargo el programa, jsp aparece vacío. Lo estaba completando antes de la misma manera usando JTextAreas (en lugar de MiniGUI) y funcionaba bien, pero JTextArea resultó terrible para formatear. Necesito insertar algunas imágenes pequeñas en las MiniGUI (más adelante), lo que no hace falta decir que es imposible de hacer con JTextAreas, por lo que no puedo deshacerme de las MiniGUI.

Parece que no puedo encontrar la respuesta en línea, así que si alguien pudiera ayudarme, sería genial. Revisé esta pregunta: ¿Cómo hago para que JScrollPane funcione correctamente con JPanels anidados?, pero reducir el tamaño de MiniGUI no funcionó, y ya estoy usando revalidate.

He publicado mi código. El JScrollPane es de aproximadamente 250x500.

import java.awt.Color;
import java.awt.Dimension;

import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingConstants;

public class MiniGUI extends JPanel {
public MiniGUI(String str1, String str2) {
    this.setLayout(null);
    this.setSize(new Dimension(250, 95));
    this.setVisible(true);

    JLabel lbl1 = new JLabel(str1);
    lbl1.setOpaque(true);
    lbl1.setVerticalAlignment(SwingConstants.TOP);
    lbl1.setBackground(Color.WHITE);
    lbl1.setBounds(0, 0, 234, 64);
    this.add(lbl1);

    JLabel lbl2 = new JLabel(str2);
    lbl2.setHorizontalAlignment(SwingConstants.RIGHT);
    lbl2.setOpaque(true);
    lbl2.setBackground(Color.WHITE);
    lbl2.setVerticalAlignment(SwingConstants.TOP);
    lbl2.setBounds(86, 63, 148, 21);
    this.add(lbl2);

    this.setBackground(Color.WHITE);

    // To be set later:
    // ImagePanel panel = img; //img passed as parameter, image panel is a class i made
    // if (img == null)
    // return;
    // panel.setBounds(0, 0, 108, 89);
    // this.add(panel);
}

Y la función que llena el panel de desplazamiento jsp:

public void fillScrollPane() {
    JPanel pane = new JPanel();
    GridBagLayout expLayout = new GridBagLayout();
    GridBagConstraints c = new GridBagConstraints();
    c.fill = GridBagConstraints.HORIZONTAL;
    c.weightx = 1;
    c.weighty = 0;
    c.gridx = 0;
    c.gridy = 0;
    pane.setLayout(expLayout);
    ArrayList<Triplet> content = this.C2.getAL(); //C2 is another class i have, getAL returns ArrayList, Triplet is just 3 strings
    for (int i = 0; i < content.size(); i += 1) {
        MiniGUI x = new MiniGUI(content.get(i).first,
                content.get(i).second + " " + content.get(i).third); //setVisible is in minigui class
        pane.add(x, c);
        pane.revalidate();
        c.gridy += 1;
    }
    MiniGUI end = new MiniGUI("", "");
    c.weighty = 1;
    pane.setBackground(Color.WHITE);
    pane.add(end, c);
    pane.setVisible(true);
    jsp.setViewportView(pane);
    jsp.revalidate();
}

preguntado el 03 de diciembre de 13 a las 13:12

No veo por qué esto fue votado negativo. Se establece el problema, al igual que el código, y pasé mucho tiempo en él antes de publicar y todavía no encontré una solución. Si vas a votar negativo, al menos explícalo para que si hay algo mal, pueda arreglarlo para la próxima vez. -

No soy el votante negativo, pero no tiene un (Ejemplo corto, autónomo, correcto y compilable) [sscce.org/] . Tiene un diseño nulo para su miniGUI. Finalmente, crea GridBagConstraints para su panel de desplazamiento, pero nunca lo modifica para cada uno de sus paneles miniGUI. -

Gracias. Intentaré mejorar el autocontenido la próxima vez. No estaba seguro (y todavía no lo estoy) de cómo poner algo que se genera dinámicamente en un ejemplo para mantenerlo autónomo. Pero no diría que el código es largo ni incorrecto. Como dije, funcionó para JTextArea, solo falta una sutileza que no pude captar porque soy algo nuevo en Java y las GUI. (Y como tal, no vi lo que está mal con los diseños nulos). Y GridBagConstraints se modifica para cada bucle. -

1 Respuestas

1) Puedes usar setPreferredSize() en lugar de setSize() para su MiniGUI, porque setSize() funciona solo con diseño nulo, pero agrega MiniGUI con la ayuda de GridBagLayout para usted pane, así que reemplace ese código y funcionará.

2) No usar this.setLayout(null); en tu MiniGUI. Tratar de usar LayoutManager, Por ejemplo FlowLayout or BorderLayout y su código también estará funcionando.

Lea más sobre LayoutManager.

Además, no es necesario revalidate() contenedor para cada adición, hágalo cuando agregue todos los componentes.

Respondido el 03 de diciembre de 13 a las 13:12

Gracias, lo probaré en cuanto pueda. - Jimmy

-1, You can use setPreferredSize() instead of setSize() for your MiniGUI, No. No codifique manualmente un tamaño preferido. El objetivo de usar un administrador de diseño es permitir que el administrador de diseño determine el tamaño adecuado del panel en función de la cantidad de componentes agregados al panel. Si codifica un tamaño, la barra de desplazamiento nunca funcionará correctamente. - camickr

No use setPreferredSize() cuando realmente quieres anular getPreferredSize(), Para ejemplo. - basurero

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.