Java tutorial
import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.Rectangle; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.Scrollable; public class Main { public static void main(String args[]) { JPanel container = new ScrollablePanel(); container.setLayout(new FlowLayout(FlowLayout.CENTER, 0, 0)); for (int i = 0; i < 20; ++i) { JPanel p = new JPanel(); p.setPreferredSize(new Dimension(50, 50)); p.add(new JLabel("" + i)); container.add(p); } JScrollPane scroll = new JScrollPane(container); scroll.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); scroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); JFrame f = new JFrame(); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.getContentPane().add(scroll); f.pack(); f.setSize(250, 300); f.setVisible(true); } } class ScrollablePanel extends JPanel implements Scrollable { public Dimension getPreferredSize() { return getPreferredScrollableViewportSize(); } public Dimension getPreferredScrollableViewportSize() { if (getParent() == null) return getSize(); Dimension d = getParent().getSize(); int c = (int) Math.floor((d.width - getInsets().left - getInsets().right) / 50.0); if (c == 0) return d; int r = 20 / c; if (r * c < 20) ++r; return new Dimension(c * 50, r * 50); } public int getScrollableBlockIncrement(Rectangle visibleRect, int orientation, int direction) { return 50; } public int getScrollableUnitIncrement(Rectangle visibleRect, int orientation, int direction) { return 10; } public boolean getScrollableTracksViewportHeight() { return false; } public boolean getScrollableTracksViewportWidth() { return getParent() != null ? getParent().getSize().width > getPreferredSize().width : true; } }