package javaapplication74; import java.awt.*; import java.awt.event.*; import javax.swing.*; public class APanel extends JScrollPane { int width = 0; public static String getRandomMultilineText() { String filler = ""; int words = (int) (Math.random() * 7) + 1; for ( int w = 0 ; w < words ; w++ ) { int lettersInWord = (int) (Math.random() * 12) + 1; for ( int l = 0 ; l < lettersInWord ; l++ ) { filler += "a"; } filler += "\n"; } return filler.trim(); } public APanel() { super(); setAlignmentX( LEFT_ALIGNMENT ); setAlignmentY( TOP_ALIGNMENT ); final Box B = Box.createVerticalBox(); B.setAlignmentX( LEFT_ALIGNMENT ); B.setAlignmentY( TOP_ALIGNMENT ); for ( int i = 0 ; i < 4 ; i++ ) { B.add( new CPanel() { //Important!!! Make sure the width always fits the screen public Dimension getPreferredSize() { Dimension result = super.getPreferredSize(); result.width = width - 20; // 20 is for the scroll bar width return result; } } ); } setViewportView( B ); //Important!!! Need to invalidate the Scroll pane, othewise it //doesn't try to lay out when the container is shrunk addComponentListener( new ComponentAdapter() { public void componentResized( ComponentEvent ce ) { width = getWidth(); B.invalidate(); } } ); } // nothing really very special in this class - mostly here for demonstration public static class CPanel extends JPanel { public CPanel() { super( new WrapLayout( WrapLayout.LEFT ) ); setOpaque( true ); setBackground( Color.gray ); setAlignmentY( TOP_ALIGNMENT ); setAlignmentX( LEFT_ALIGNMENT ); int wordGroups = (int) (Math.random() * 14) + 7; //Adding test data (TextAreas) for ( int i = 0 ; i < wordGroups ; i++ ) { JTextArea ta = new JTextArea( getRandomMultilineText() ); ta.setAlignmentY( TOP_ALIGNMENT ); add( ta ); } setBorder( BorderFactory.createTitledBorder( "Lovely container" ) ); } } public static void main( String[] args ) { final JFrame frame = new JFrame(); frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); frame.add( new APanel() ); frame.pack(); frame.setSize( 400 , 300 ); frame.setLocationRelativeTo( null ); frame.setVisible( true ); } }