Not only is this a general burden to developers who are accustomed to better support for this in toolkits, but it is also a serious performance problem, since there is a round trip (native->java->native) for each individual scroll event that occurs, and the application must respond to the event and move its contents using slower java draw/move operations. This is particularly noticeable during the event-intensive scroll-drag operations.
java.awt.ScrollPane
The ScrollPane supports three modes for its scrollbars:
java.awt.Adjustable
Therefore, if a program wishes to set properties such as the unitIncrement,value, etc. on the scrollpane, it would first get the appropriate Adjustable and set the property there.
import java.awt.*;
public class Scroller extends Frame {
public Scroller() {
super("Scroller Example");
ScrollPane scroller = new ScrollPane(ScrollPane.SCROLLBARS_AS_NEEDED);
scroller.add(new DrawCanvas());
Adjustable vadjust = scroller.getVAdjustable();
Adjustable hadjust = scroller.getHAdjustable();
hadjust.setUnitIncrement(10);
vadjust.setUnitIncrement(10);
scroller.setSize(200, 200);
add("Center", scroller);
pack();
}
// No more handleEvent method needed to implement scrolling!
public static void main(String args[]) {
Scroller test = new Scroller();
test.show();
}
}
class DrawCanvas extends Component {
public Dimension getPreferredSize() {
return new Dimension(300, 300);
}
public void paint(Graphics g) {
// Note: For most efficient repainting, we should check the
// clip rectangle in the Graphics object to determine the
// damaged region and only paint that; we don't do that here
// for simplicity in this example
//
Rectangle r = getBounds();
g.setColor(Color.black);
g.fillRect(0, 0, r.width, r.height);
g.setColor(Color.yellow);
g.drawLine(0, 0, r.width, r.height);
g.setColor(Color.white);
g.drawLine(0, r.height, r.width, 0);
}
}