Mega Code Archive

 
Categories / Java / Swing JFC
 

Customized ScrollPane

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);        }    }