Mam prostą klasę MainFrame rozszerzającą klasę JFrame, która zawiera obiekt klasy BoardPanel dziedziczącej (przechodnio) po JPanel. Board panel zawiera zaś JScrollPane. Przeciążyłem metody paintComponent() tak aby BoardPanel dynamicznie dostosowywał rozmiar do MainFrame, oraz aby JScrollPane automatycznie dostosowywał rozmiar do BoardPanel. Niestety z tym JScrollPanem to nie zawsze tak ładnie działa.

Żeby mieć się do czego odnosić w opisie problemu, najpierw pokażę kod:

 
public class MainFrame extends JFrame
{
	private BoardPanel boardPanel;
	
	/***************************************************************/
	/***************************************************************/
	
	public MainFrame()
	{
		setBounds(50, 50, 1200, 700);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setLayout(null);
		
		MyEventListener myEventListener = new MyEventListener();
		addMouseListener(myEventListener);
		addMouseMotionListener(myEventListener);
		
		addComponents();
		
		setVisible(true);
	}
	
	/***************************************************************/
	
	private void addComponents()
	{
		boardPanel = new BoardPanel();
		add(boardPanel);
		boardPanel.setVisible(true);
	}
	
	/***************************************************************/
	
	protected void paintComponent(Graphics g)
	{
		boardPanel.repaint();
	}
	
	/***************************************************************/
public class BoardPanel extends MyPanel
{
	private JScrollPane scrollPane;
	private JPanel contentPanel;
	int freeSpace = 100;
	
	/***************************************************************/
	/***************************************************************/
	
	public BoardPanel()
	{
		setLayout(null);
		setLocation(0, freeSpace);
		setSize(1200, 700 - freeSpace);
		setBackground(Color.CYAN);
		
		contentPanel = new JPanel();
		contentPanel.setPreferredSize(new Dimension(this.getWidth()-35, this.getHeight()-45));
		contentPanel.setLayout(null);
		contentPanel.setBackground(Color.white);
		
		scrollPane = new JScrollPane(contentPanel);
		scrollPane.setLocation(0,0);
		add(scrollPane);
	}
	
	/***************************************************************/
	
	protected void paintComponent(Graphics g)
	{
		setSize(getParent().getWidth(), getParent().getHeight()-freeSpace);
		contentPanel.setPreferredSize(new Dimension(this.getWidth()-20, this.getHeight()-20));
		scrollPane.setSize(this.getWidth()-1, this.getHeight()-1);
		super.paintComponent(g);
	}
	
	/***************************************************************/
} 

Powyższy kod działa w 100%, niestety jeżeli w BoardPanel w paintComponent w linijce: scrollPane.setSize(this.getWidth()-1, this.getHeight()-1); usunę -1 albo dodam jakąś liczbę zamiast odjąć, wówczas ani scrollPane ani boardPanel nie zmieniają rozmiarów :/ Innymi słowy, dynamiczne skalowanie działa tylko wtedy gdy scrollPane < boardPanel. Co na to poradzić ? Chciałbym aby scrollPane mógł mieć identyczną wielkość co boardPanel i żeby się wszystko ładnie skalowało.