Zrobiłem sobie JFrame (BorderLayout) zawierający JScrollPane, a w nim JPanel (GridBagLayout). W tym ostatnim dodaje na przemian i jedno pod drugim: JLabel i JTextArea, na koniec JSeparator. Jak to się otworzy to wszystko jest ładnie poukładane, jak powieszę okno wszystko dobrze się dopasowuje, ale jak zaczynam zmniejszać szerokość JPanel pozostaje bez zmian. Jak ustawić teraz poprawną szerokość JPanel?

Kombinowałem dodać do JScrollPanel ComponentListener i w nim ustawiać preferredSize dla JPanel, ale jak coś zaczęło działać z szerokością to z kolei nie wychodzi mi obliczenie wysokości.

Wygenerowałem przykładowe okno, aby pokazać co to mniej więcej mi chodzi:

public class Frame extends javax.swing.JFrame {

    public Frame() {
        initComponents();
    }

    private void initComponents() {
        java.awt.GridBagConstraints gridBagConstraints;

        scrollPane = new javax.swing.JScrollPane();
        panel = new javax.swing.JPanel();
        label1 = new javax.swing.JLabel();
        textArea = new javax.swing.JTextArea();
        label2 = new javax.swing.JLabel();
        textArea2 = new javax.swing.JTextArea();
        separator = new javax.swing.JSeparator();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        panel.setLayout(new java.awt.GridBagLayout());

        label1.setText("jLabel1");
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 0;
        gridBagConstraints.gridy = 0;
        gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
        panel.add(label1, gridBagConstraints);

        textArea.setColumns(20);
        textArea.setLineWrap(true);
        textArea.setRows(5);
        textArea.setWrapStyleWord(true);
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 0;
        gridBagConstraints.gridy = 1;
        gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
        panel.add(textArea, gridBagConstraints);

        label2.setText("jLabel2");
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 0;
        gridBagConstraints.gridy = 2;
        gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
        panel.add(label2, gridBagConstraints);

        textArea2.setColumns(20);
        textArea2.setLineWrap(true);
        textArea2.setRows(5);
        textArea2.setWrapStyleWord(true);
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 0;
        gridBagConstraints.gridy = 3;
        gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
        panel.add(textArea2, gridBagConstraints);
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 0;
        gridBagConstraints.gridy = 4;
        gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
        gridBagConstraints.weightx = 1.0;
        gridBagConstraints.weighty = 1.0;
        panel.add(separator, gridBagConstraints);

        scrollPane.setViewportView(panel);

        getContentPane().add(scrollPane, java.awt.BorderLayout.CENTER);

        pack();
    }

    private javax.swing.JLabel label1;
    private javax.swing.JLabel label2;
    private javax.swing.JPanel panel;
    private javax.swing.JScrollPane scrollPane;
    private javax.swing.JSeparator separator;
    private javax.swing.JTextArea textArea;
    private javax.swing.JTextArea textArea2;
}