Warum nicht mein JPanel bevorzugte Größe ändern, wenn die darin enthaltenen JScrollPane in Grouplayout tut?

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

  •  02-10-2019
  •  | 
  •  

Frage

Mit Grouplayout und den Code unten, bemerkte ich, dass die leftPanel nicht aktualisiert es die gewünschte Größe ist. Ich dachte, das sollte automatisch sein und erscheinen in anderem Layout-Manager zu arbeiten. Wie kann ich dieses Verhalten mit Grouplayout bekommen?

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
War es hilfreich?

Lösung

Die bevorzugte Größe einer Komponente basiert auf der bevorzugten Größe der Komponenten hinzugefügt werden.

Ja, die bevorzugte Größe des JList wird sich ändern, wie Sie Artikel zu der Liste hinzufügen. Allerdings ist der JList zu einem JScrollPane hinzugefügt, so dass sie die bevorzugten Größe des JScrollPane, die verwendet wird, um die bevorzugte Größe des JPanel zu bestimmen.

Da Sie eine IDE verwenden, um erstellen Sie Ihre GUI Aussehen ist wie die bevorzugte Größe des JScrollPane zur Entwurfszeit bestimmt wird und in die Einschränkung fest einprogrammiert. Die bevorzugte Größe des JScrollPane wird sich nicht ändern, wenn der Rahmen geändert wird oder wie Sie Elemente in die JList hinzufügen. Die „Größe“ des JScrollPane und JPanel wird wie ändert der Rahmen der Größe verändert wird.

Andere Tipps

Nicht alle LayoutManagers nehmen Component.preferredSize () berücksichtigt werden, wenn ihr Layout zu tun. Die beiden, die ich kenne, das zu tun sind und Flow BoxLayout (andere Macht, aber sie könnten nicht).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top