It is said in manual, that if child does not implement Scrollable, then JScrollPane rely on preferredSize properties of it's content.
Apparently this is not true for me. I am increasing preferred height, but JScrollPane does not feel or react on it.
package tests;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.Timer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Try01_JScrollPane extends JFrame {
    private static final long serialVersionUID = 4123186105171813186L;
    private static final Logger log = LoggerFactory.getLogger(Try01_JScrollPane.class);
    JPanel yellowPanel = new JPanel();
    {
        yellowPanel.setPreferredSize(new Dimension(200,50));
        yellowPanel.setSize(new Dimension(200,50));
        yellowPanel.setBackground(Color.yellow);
    }
    JScrollPane scrollPane = new JScrollPane(yellowPanel);
    {
        scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
    }
    AbstractAction increaseAction = new AbstractAction() {
        @Override
        public void actionPerformed(ActionEvent e) {
            yellowPanel.setPreferredSize(new Dimension(yellowPanel.getPreferredSize().width, yellowPanel.getPreferredSize().height+100));
            log.debug("preferred height is now {}", yellowPanel.getPreferredSize().height);
        }
    };
    Timer increaseTimer = new Timer(1000, increaseAction);
    {
        setLayout(new BorderLayout());
        add(scrollPane, BorderLayout.CENTER);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setSize(200, 400);
        setTitle("Try01_JScrollPane");
        increaseTimer.start();
        setVisible(true);
    }
    public static void main(String[] args) {
        new Try01_JScrollPane();
    }
}
 
     
     
    
