Java AWT:ScrollPane コンテナ


最終更新日: 1997 年 2 月 3 日

問題

AWT 1.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 © 1996, 1997 Sun Microsystems, Inc. All rights reserved.