Se vuoi rendere scrollabile un pannello, devi gestire tutto a mano: ridimensionamenti e notifiche al JScrollPane.
Sto facendo delle prove. Ho preso anche come codice di esempio un tuo codice di un post:

codice:
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

public class ProvaPannelli extends JFrame implements ActionListener {

   private JPanel pannello;
   private JScrollPane scroller;
   private JButton cmdAggiungi;
   private int count;

   public ProvaPannelli() {
      count = 0;

      Container c = getContentPane();
      c.setLayout( new BorderLayout() );

      pannello = new JPanel();
      pannello.setLayout( null );

      scroller = new JScrollPane( pannello );

      cmdAggiungi = new JButton("Aggiungi Label");
      cmdAggiungi.addActionListener( this );

      JPanel jpCmd = new JPanel( new FlowLayout(FlowLayout.CENTER, 10, 10) );
      jpCmd.add( cmdAggiungi );

      c.add(scroller, BorderLayout.CENTER);
      c.add(jpCmd, BorderLayout.SOUTH);

      setDefaultCloseOperation( EXIT_ON_CLOSE );
      setTitle("Prova Pannelli");
      setResizable( true );
      setSize(800, 600);
      setVisible( true );
   }

   public void actionPerformed(ActionEvent ae) {
      JLabel lbl = new JLabel("Label numero " + (count+1));
      lbl.setBounds(10, (count * 20)+1, 100, 20);
      count++;
      pannello.add( lbl );
      Dimension d = pannello.getSize();
      if (d.height < (count * 20)) {
         // Devo ridimensionare il pannello
         d.height = (count * 20);
         pannello.setPreferredSize( d );
         pannello.repaint();
         pannello.doLayout();
         scroller.getViewport().doLayout();
      }
      repaint();
      doLayout();
   }

   public static void main(String[] args) {
      ProvaPannelli pp = new ProvaPannelli();
   }
}
che funziona perfettamente.

Tuttavia non riesco a far funzionare un mio codice (questa è solo una parte):




codice:
 private void VisualizzaSchermi() {
	   if (!Schermi.isEmpty()){
		   		   
		   int larghezzaSchermo = Schermi.get(0).getWidth();
		   int altezzaSchermo = Schermi.get(0).getHeight();
		   int nCol = panelScreens.getWidth() / larghezzaSchermo;

		   int spazio = (panelScreens.getWidth() - (nCol * larghezzaSchermo)) / (nCol + 2) ;
		   		   
		   int cont = 0;
		   int x = spazio;
		   int y = 5;
		   
		   double altezzaPannello = (Schermi.size() / nCol) * altezzaSchermo;
		   txtdebug2.setText(String.valueOf(altezzaPannello));
		   
		   
		   //panelScreens.setBackground(Color.BLUE);
		   
		   for (int i = 0 ; i < Schermi.size(); i++) {
			   //Sposta coordinata x
			   if (cont > 0 && cont <= nCol) {
				  x += larghezzaSchermo + spazio;
			   }   
			   
			   //Va a capo e sposta coordinata y
			   if ( cont == nCol ) {
				   x  = spazio;
				   y += altezzaSchermo + 5;		
				   cont = 0;
			   }
			   //Stampa il pannello
			   Schermi.get(i).setLocation(x, y);
			   panelScreens.add(Schermi.get(i));
			   cont++;
		   }
		   
		   panelScreens.repaint();
		   panelScreens.setPreferredSize( new Dimension( 800 , 1000));
		   panelScreens.doLayout();
		   scrollInfo.getViewport().doLayout();
		   
		   
		   repaint();
		   doLayout();
		   
		  txtdebug.setText( String.valueOf(Schermi.size() ));	   
	   }
	   
	   
	   
   }
E' questa la parte in questione, puoi dargli un'occhiata?
Queste prove sono per studiarci un po' su ma credo farò un panel scrollabile come mi8hai suggerito

grazie