¿Por qué no cambia el tamaño preferido de mis JPanel cuando su contenido JScrollPane hace en GroupLayout?

StackOverflow https://stackoverflow.com/questions/3680531

  •  02-10-2019
  •  | 
  •  

Pregunta

El uso de GroupLayout y el código de abajo, me di cuenta de que el leftPanel no se actualiza su tamaño preferido. Pensé que esto iba a ser automático y parece funcionar en otros controladores de distribución. ¿Cómo puedo conseguir que el comportamiento con GroupLayout?

import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class SizeTesting {
    public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(400,400);

        JSplitPane splitPane = new JSplitPane();

        final JPanel leftPanel = new JPanel();
        final DefaultListModel listModel = new DefaultListModel();
        final JList list = new JList(listModel);
        final JScrollPane jsp = new JScrollPane(list);
        leftPanel.add(jsp);

        splitPane.setLeftComponent(leftPanel);

        GroupLayout panel1Layout = new GroupLayout(leftPanel);
        leftPanel.setLayout(panel1Layout);
        panel1Layout.setHorizontalGroup(
            panel1Layout.createParallelGroup()
                .addComponent(jsp, GroupLayout.Alignment.TRAILING, GroupLayout.DEFAULT_SIZE, 157, Short.MAX_VALUE)
        );
        panel1Layout.setVerticalGroup(
        panel1Layout.createParallelGroup()
            .addGroup(GroupLayout.Alignment.TRAILING, panel1Layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jsp, GroupLayout.DEFAULT_SIZE, 377, Short.MAX_VALUE))
        );



        JPanel rightPanel = new JPanel();

        JButton button = new JButton("Add Long Item");
        button.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent actionEvent) {
                System.out.println("Preferred Size of List BEFORE: " + list.getPreferredSize());
                System.out.println("Preferred Size of ScorllPane BEFORE: " + jsp.getPreferredSize());
                System.out.println("Preferred size of LeftPanel BEFORE: " + leftPanel.getPreferredSize());
                System.out.println();

                listModel.addElement("Really long, new Item in List");
                System.out.println("Preferred Size of List AFTER: " + list.getPreferredSize());
                System.out.println("Preferred Size of ScorllPane AFTER: " + jsp.getPreferredSize());
                System.out.println("Preferred size of LeftPanel AFTER: " + leftPanel.getPreferredSize());
            }
        });
        rightPanel.add(button);
        splitPane.setRightComponent(rightPanel);

        listModel.addElement("Test");
        listModel.addElement("Test2");
        listModel.addElement("Test3");

        frame.add(splitPane);
        frame.setVisible(true);
    }
} // end class SizeTesting
¿Fue útil?

Solución

El tamaño preferido de un componente se basa en el tamaño preferido de los componentes añadidos a la misma.

Sí, el tamaño preferido del JList cambiará a medida que se agregan elementos a la lista. Sin embargo, el JList se añade a una JScrollPane, por lo que su el tamaño preferido de la JScrollPane que se utiliza para determinar el tamaño preferido de la JPanel.

Desde que está utilizando un IDE para crear su interfaz gráfica de usuario es parece que el tamaño preferido del JScrollPane se determina en tiempo de diseño y codificado en la restricción. El tamaño preferido del JScrollPane no va a cambiar a medida que se cambia el tamaño del marco o a medida que agrega elementos a la JList. El "tamaño" de la JScrollPane y JPanel cambiará a medida que el bastidor se cambia el tamaño.

Otros consejos

No todos los LayoutManagers toman Component.preferredSize () a la hora de hacer su diseño. Los dos que yo sepa que lo hacen son FlowLayout y BoxLayout (otros podrían hacerlo, pero no podría).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top