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