GUI の構成ブロックであるコンポーネントを使 用する |
スクロールバーには 2 つの使い方がある。
- スクロールバーはユーザが値を設定するために操作するスライダとして機能する。 この例は、GUI ベースのプログラムの構造の Converter プログラムに示されている。
- スクロールバーは有効な表示エリアに対して大きすぎる領域の一部を表示するのに便利である。 スクロールバーにより、ユーザはどの範囲を見えるようにするか細かく選ぶことができる。 ここに例を示す (イメージのロードに少し時間がかかる)。
スクロールバーを作成するときは、Scrollbar クラスのインスタンスを作成する必要がある。 また、以下に示す値を、Scrollbar 構築子 に指定するか、または
setValues()
メソッドを呼び出すことによって、初期化しなければならない。その後、スクロールバーを見えるようにする。
int orientation
- スクロールバーの方向が水平か垂直かを指示する。
Scrollbar.HORIZONTAL
かScrollbar.VERTICAL
のどちらかを指定する。int value
- スクロールバーの初期値。 スクロール領域を制御するスクロールバーでは、この値は通常、最初にスクロール領域が表示されるときに可視となる部分の x 値 (水平方向のスクロールバーの場合) か y 値 (垂直方向のスクロールバーの場合) である。 たとえば、上記のアプレットが始動するとき、水平方向と垂直方向のスクロールバーの値はどちらも 0 であり、表示されるイメージ部は (0,0) から始まる。
int visible
- スクロール領域の可視部をピクセル単位で表したサイズ。 この値は、スクロールバーが可視になる前に設定されると、スクロールバー (ノブではない) でのクリックによって表示エリアが何ピクセル、シフトするかを決定する。 ただし、スクロールバーが可視になった後に設定しても無効である。スクロールバーが可視になった後に同じ効果を得るには、
setPageIncrement()
メソッドを使用する。int minimum
- スクロールバーが持ち得る最小値。 スクロール領域を制御するスクロールバーでは、この値は通常 0 (領域の左上隅) である。
int maximum
- スクロールバーが持ち得る最大値。 スクロール領域を制御するスクロールバーでは、この値は通常、次のようになる。 (部分的に表示されているコンポーネントのピクセル単位での幅/高さ) − (スクロール領域の現在可視である幅/高さ)
次の図で、上記の値の意味をわかりやすく示す。
上記のアプレットのコードも参照できる。 このコードは 2 つのクラスを定義している。1 つは、イメージを描画する単純な Canvas サブクラス (ScrollableCanvas) である。 もう 1 つは ScrollableCanvas と 2 つの Scrollbar を作成して保持するPanel サブクラス (実際は Applet を拡張した ImageScroller) である。 このプログラムは、スクロール領域を管理する上で重要なことをいくつか示している。
- スクロールバーのイベント処理は比較的簡単に行える。 プログラムは、スクロール領域内でそれ自身を表示している Component がアク セスできる場所にスクロールバーの新しい値を保存し、その Component に
repaint()
を呼び出して、スクロールイベントに反応するだけでよい 。
public boolean handleEvent(Event evt) {
switch (evt.id) {
case Event.SCROLL_LINE_UP:
case Event.SCROLL_LINE_DOWN:
case Event.SCROLL_PAGE_UP:
case Event.SCROLL_PAGE_DOWN:
case Event.SCROLL_ABSOLUTE:
if (evt.target == vert) {
canvas.ty = ((Integer)evt.arg).intValue();
canvas.repaint();
}
if (evt.target == horz) {
canvas.tx = ((Integer)evt.arg).intValue();
canvas.repaint();
}
}
return super.handleEvent(evt);
}
- スクロール領域内にそれ自身を表示する Component は非常に単純にできる。 制御しているスクロールバーの値によって指定された位置を起点として、それ自身を描画するだけでよい。
paint()
またはupdate()
メソッドの冒頭に次のようなコードを記述することにより、Component の起点を変更することができる (通常の描画コードを変更する必要はない)。
g.translate(-tx, -ty);
- スクロールの発生中、表示エリアはちかっと光ったり (フラッシング)、ゆらめいて見えたり (フリッカリング) する。 これを止めたい場合は、表示される Component に
update()
メソッド を実装する必要があり、また、なるべくダブルバッファリングを行うようにする。 この方法については、フラッシングを除去するで説明されている。スクロール領域がサイズ変更可能な場合、スクロールに関して起こりやすい問題がある。 注意して対応しないと、ユーザが領域の右/下へスクロールした後、領域を大きくするときに、スクロール領域が右/下にブランクスペースを表示してしまうのである。 ユーザがスクロールして右/下に戻ると、ブランクスペースはなくなっている。 不必要にブランクスペースを表示するのを避けるには、スクロール領域のサイズが大きくなるときにComponent の起点をシフトし、有効な新しいスペースを十分に利用できるようにする。次にこの例を示す。 int canvasWidth = canvas.size().width; //右側に空のスペースが表示されるときは //すべてを右側にシフトする。 if ((canvas.tx + canvasWidth) > imageSize.width) { int newtx = imageSize.width - canvasWidth; if (newtx次の図に、スクロールの問題とその解決策を示す。
GUI の構成ブロックであるコンポーネントを使用する |