最終更新日: 1997 年 2 月 3 日
問題
AWT 1.0 では、すべてのスクロール動作を実装するタスクは開発者に任されていました。Java プログラムが管理する必要のある基本的な Scrollbar クラスだけが提供され、Java プログラムがスクロールバーイベントをキャッチし、スクロールされるコンテンツを更新するために適当なアクションを取る必要がありました。
これは、ツールキットでのサポートに慣れている開発者にとって全体的な負担になるだけでなく、重大なパフォーマンスの問題でもあります。これは、発生する個々のスクロールイベントがラウンドトリップ (ネイティブ->Java->ネイティブ) し、アプリケーションはイベントに応答し、遅い Java の描画/移動オペレーションを使用してそのコンテンツを移動する必要があるからです。これは、特にイベント集約型スクロールドラッグ操作の際には顕著です。
スクロールペイン API
この問題を解決するために、ScrollPane クラスがバージョン 1.1 の AWT に追加されました。ScrollPane は、単一のコンポーネントの子に対して自動スクロールを実装するコンテナを提供します。
java.awt.ScrollPane
ScrollPane は、そのスクロールバーに対して 3 つのモードをサポートします。
java.awt.Adjustable
そのため、プログラムが unitIncrement,value などのプロパティをスクロールペイン上に設定したい場合、最初に適切な Adjustable を取得し、そこにプロパティを設定します。
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);
}
}