Bene, prova questo programma:
codice:
import java.awt.*;
import javax.swing.*;
public class TestFrame extends JFrame {
public TestFrame() {
super("Test");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(300, 300);
JPanel mainPanel = new JPanel();
mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.Y_AXIS));
JScrollPane scrollPane = new JScrollPane(mainPanel);
mainPanel.add(creaPanel(4));
mainPanel.add(creaPanel(2));
mainPanel.add(creaPanel(6));
getContentPane().add(scrollPane);
}
public JPanel creaPanel(int numButton) {
JPanel p = new JPanel();
p.setLayout(new BoxLayout(p, BoxLayout.X_AXIS));
p.setAlignmentX(Component.LEFT_ALIGNMENT);
p.setBorder(BorderFactory.createLineBorder(Color.RED, 2));
for (int i = 0; i < numButton; i++) {
JButton b = new JButton(Integer.toString(i+1));
p.add(b);
}
return p;
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
TestFrame f = new TestFrame();
f.setVisible(true);
}
});
}
}
Ho messo un bordino rosso ai panel per evidenziarne la dimensione. Come puoi vedere se lo lanci, ognuno dei tre panel ha una dimensione "giusta" per contenere appena i button.
Se vuoi che i panel abbiano la stessa larghezza del panel principale (se più largo dei panel contenuti), prova ora a mettere questo codice appena prima del return p;
codice:
Dimension maxSize = p.getMaximumSize();
maxSize.width = Integer.MAX_VALUE;
p.setMaximumSize(maxSize);
Con questa modifica, se il panel principale è molto più largo dello spazio occupato dai pulsanti, i pannelli si espandono al massimo possibile orizzontalmente. Se invece restringi la finestra, si arriva ad avere il panel principale più piccolo dello spazio occupato dai pulsanti e quindi compare la scrollbar orizzontale.
È questo che volevi o no??
Se poi vuoi che ognuno dei pannelli abbia una certa altezza da te imposta, allora imposta il "preferred size" (solo l'altezza chiaramente).
Se non è questo ciò che vuoi ... allora rispiega meglio che non ho capito una mazza.