Non è sufficiente ridimensionare il pannello: è necessario anche "notificare" il JScrollPane che qualcosa è cambiato.
Ti posto un esempio che ho sviluppato al volo:
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();
}
}
Ad ogni pressione del pulsante viene aggiunta una JLabel al pannello (una sotto l'altra). Quando la dimensione del pannello non è sufficiente a visualizzarle tutte, la aumento e notifico il ViewPort del JScrollPane.
Osserva anche che la dimensione (altezza) del pannello la calcolo tenendo conto della dimensione (altezza) delle JLabel (20).
Ciao.