Pourquoi ne pas la taille préférée de mon JPanel changement lorsque son contenu JScrollPane fait dans GroupLayout?

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

  •  02-10-2019
  •  | 
  •  

Question

Utilisation GroupLayout et le code ci-dessous, je remarque que le leftPanel n'est pas mise à jour de sa taille préférée. Je pensais que cela était censé être automatique et semble fonctionner dans d'autres gestionnaires de mise en page. Comment puis-je obtenir ce comportement avec 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
Était-ce utile?

La solution

La taille préférée d'un composant est basé sur la taille préférée des composants ajoutés.

Oui, la taille préférée du JList changera lorsque vous ajoutez des éléments à la liste. Cependant, le JList est ajouté à un JScrollPane, de sorte que sa taille préférée de l'JScrollPane qui est utilisé pour déterminer la taille préférée de l'JPanel.

Puisque vous utilisez un IDE pour créer votre interface graphique est ressemble à la taille préférée des JScrollPane est déterminée au moment de la conception et la contrainte dans hardcoded. La taille préférée des JScrollPane ne changera pas le cadre est redimensionné ou que vous ajoutez des éléments à la JList. La « taille » du JScrollPane et JPanel changera que le cadre est redimensionnée.

Autres conseils

ne sont pas tous LayoutManagers prennent Component.preferredSize () en compte lors de faire leur mise en page. Les deux que je connaisse qui ne sont FlowLayout et BoxLayout (d'autres pourraient, mais ils ne pourraient pas).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top