Java AWT: ScrollPane コンテナ


最終更新: 1997 年 2 月 3 日

問題

AWT1.0 では、スクロール動作すべてを実装するタスクは開発者に任されていました。Java プログラムが管理する必要のある基本的な Scrollbar クラスだけが提供され、 Java プログラムがスクロールバーイベントをキャッチし、スクロールされるコンテンツを更新するために適当なアクションを取る必要がありました。

ツールキットでもっとよいサポートに慣れている開発者にとって、これは全般的に負荷になるだけでなく、重大なパフォーマンスの問題でもあります。それは、発生する個別のスクロールイベント各々にとってラウンドトリップ (ネイティブ->java->ネイティブ) となり、アプリケーションはイベントに応答し、遅い Java 描画/移動操作を使用してそのコンテンツを移動する必要があるからです。これは、特にイベント集中スクロールドラッグ操作の際は顕著です。

スクロールペイン API

この問題を解決するために、ScrollPane クラスが 1.1 の AWT に追加されています。ScrollPane は単一コンポーネントの子に対して自動スクロールを実装するコンテナを提供します:
	java.awt.ScrollPane
ScrollPane はそのスクロールバーに対して 3 つのモードをサポートします:
  1. 「必要時」のスクロールバー: 子のサイズがスクロールペインのサイズを超えたときだけ、スクロールバーが表示される。
  2. 「常時」のスクロールバー: 子と親の相対的なサイズに関わらず、スクロールバーは常に表示される。
  3. 「非表示」のスクロールバー: スクロールバーは決して表示されず、プログラムはスクロールが発生するときを完全に制御する。このモードは、プログラムが自分のスクロールバー制御を実装したいときに有用である。
ケース 1 & 2 の垂直および水平スクロールバーの状態は、次のインタフェースを実装する ScrollPane に対する別個の内部オブジェクトによって表されます:
       java.awt.Adjustable
そのため、プログラムが unitIncrement,value などのプロパティをスクロールペイン上にセットしたい場合、最初に適当な Adjustable を取得し、プロパティをそこにセットします。

サンプルコード

次のサンプルコードはサンプルケースでのこの API の使用方法です:
	
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);
    }
}


フィードバックは java-awt@java.sun.com 宛てに送ってください。
Copyright (C) 1996, 1997 Sun Microsystems, Inc. All rights reserved.