Java AWT: ScrollPane コンテナ
最終更新: 1997 年 2 月 3 日
問題
AWT1.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);
}
}