CustomScrollPane.java Source code

Java tutorial

Introduction

Here is the source code for CustomScrollPane.java

Source

import java.awt.Dimension;
import java.awt.event.AdjustmentEvent;
import java.awt.event.AdjustmentListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;

import javax.swing.ImageIcon;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollBar;

public class CustomScrollPane extends JPanel {
    protected JScrollBar verticalBar = new JScrollBar(JScrollBar.VERTICAL, 0, 0, 0, 0);

    protected JScrollBar horizontalBar = new JScrollBar(JScrollBar.HORIZONTAL, 0, 0, 0, 0);

    protected CustomViewport viewport = new CustomViewport();

    protected JComponent innerComponent;

    public CustomScrollPane(JComponent comp) {
        setLayout(null);

        add(viewport);
        innerComponent = comp;
        viewport.add(innerComponent);

        verticalBar.setUnitIncrement(5);
        add(verticalBar);

        horizontalBar.setUnitIncrement(5);
        add(horizontalBar);

        AdjustmentListener lst = new AdjustmentListener() {
            public void adjustmentValueChanged(AdjustmentEvent e) {
                viewport.doLayout();
            }
        };
        verticalBar.addAdjustmentListener(lst);
        horizontalBar.addAdjustmentListener(lst);
    }

    public void doLayout() {
        Dimension size = getSize();
        Dimension innerComponentSize = innerComponent.getPreferredSize();
        Dimension verticalBarSize = verticalBar.getPreferredSize();
        Dimension horizontalBarSize = horizontalBar.getPreferredSize();

        int width = Math.max(size.width - verticalBarSize.width - 1, 0);
        int height = Math.max(size.height - horizontalBarSize.height - 1, 0);
        viewport.setBounds(0, 0, width, height);
        verticalBar.setBounds(width + 1, 0, verticalBarSize.width, height);
        horizontalBar.setBounds(0, height + 1, width, horizontalBarSize.height);

        int maxWidth = Math.max(innerComponentSize.width - width, 0);
        horizontalBar.setMaximum(maxWidth);
        horizontalBar.setBlockIncrement(maxWidth / 5);
        horizontalBar.setEnabled(maxWidth > 0);

        int maxHeight = Math.max(innerComponentSize.height - height, 0);
        verticalBar.setMaximum(maxHeight);
        verticalBar.setBlockIncrement(maxHeight / 5);
        verticalBar.setEnabled(maxHeight > 0);

        horizontalBar.setVisibleAmount(horizontalBar.getBlockIncrement());
        verticalBar.setVisibleAmount(verticalBar.getBlockIncrement());
    }

    public Dimension getPreferredSize() {
        Dimension innerComponmentSize = innerComponent.getPreferredSize();
        Dimension verticalBarSize = verticalBar.getPreferredSize();
        Dimension d2 = horizontalBar.getPreferredSize();
        Dimension horizontalBarSize = new Dimension(innerComponmentSize.width + verticalBarSize.width,
                innerComponmentSize.height + d2.height);
        return horizontalBarSize;
    }

    class CustomViewport extends JPanel {
        public CustomViewport() {
            setLayout(null);
        }

        public void doLayout() {
            Dimension innerComponentSize = innerComponent.getPreferredSize();
            int x = horizontalBar.getValue();
            int y = verticalBar.getValue();
            innerComponent.setBounds(-x, -y, innerComponentSize.width, innerComponentSize.height);
        }
    }

    public static void main(String[] args) {
        JFrame f = new JFrame("JScrollBar Demo");
        f.setSize(300, 250);

        ImageIcon icon = new ImageIcon("earth.jpg");
        CustomScrollPane myScrollPane = new CustomScrollPane(new JLabel(icon));
        f.getContentPane().add(myScrollPane);

        WindowListener wndCloser = new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        };
        f.addWindowListener(wndCloser);
        f.setVisible(true);

    }

}