Почему предпочтительный размер моего JPanel не изменяется, когда его содержание в JScrollPane изменяется в GroupLayout? - PullRequest
1 голос
/ 10 сентября 2010

Используя GroupLayout и приведенный ниже код, я заметил, что leftPanel не обновляет свой предпочтительный размер. Я думал, что это должно быть автоматически и, похоже, работает в других менеджерах по расположению. Как я могу получить такое поведение с 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

Ответы [ 2 ]

1 голос
/ 10 сентября 2010

Предпочтительный размер компонента основан на предпочтительном размере добавляемых к нему компонентов.

Да, предпочтительный размер JList будет меняться при добавлении элементов в список.Однако JList добавляется в JScrollPane, поэтому его предпочтительный размер JScrollPane, который используется для определения предпочтительного размера JPanel.

Поскольку вы используете IDE для создания своего GUI, выглядитпредпочтительный размер JScrollPane определяется во время разработки и жестко закодирован в ограничение.Предпочтительный размер JScrollPane не изменится при изменении размера фрейма или при добавлении элементов в JList.«Размер» JScrollPane и JPanel будет изменяться при изменении размера кадра.

1 голос
/ 10 сентября 2010

Не все LayoutManager учитывают Component.preferredSize () при создании макета. Два из тех, что я знаю об этом, - FlowLayout и BoxLayout (другие могут, но не могут).

...