スクロールペイン


スクロール機能搭載

ビューポートを用いれば簡単なスクロール機能を搭載できましたが
これを、全てのスクロールが必要なビューに記述するのは効率的ではありません
何より、ユーザーはスクロールバーによるスクロールを期待するでしょう

スクロールバーを抱合した統一的なスクロール処理をサポートするため
Swing はスクロールペインを実装し、これをサポートしています
スクロールペインは javax.swing.JScrollPane に実装されています
java.lang.Object
  |
  +--java.awt.Component
        |
        +--java.awt.Container
              |
              +--javax.swing.JComponent
                    |
                    +--javax.swing.JScrollPane

public class JScrollPane extends JComponent
	implements ScrollPaneConstants, Accessible
このクラスのコンストラクタは、次のようなものが公開されています

public JScrollPane()
public JScrollPane(int vsbPolicy , int hsbPolicy)
public JScrollPane(Component view)
public JScrollPane(Component view , int vsbPolicy , int hsbPolicy)

view にはスクロール対象のビューコンポーネントを指定します
このコントロールは、スクロールペインが管理するビューポートに表示されます

vsbPolicy には、垂直スクロールバーの表示ポリシー
hsbPolicu には、水平スクロールバーの表示ポリシーを指定します
表示ポリシーとは、スクロールバーがどのようなタイミングで表示されるかを表すもので
デフォルトでは、ビューポートのサイズがビューのサイズを下回ったときに表示されます

指定できる表示ポリシーのフィールド定数は
javax.swing.ScrollPaneConstants インターフェイスが提供しています

public interface ScrollPaneConstants

このインターフェイスは、次のようなポリシー用定数を定義しています
このほかにも、スクロールペインに必要ないくつかの定数が定義されていますが省略します

フィールド定数 解説
HORIZONTAL_SCROLLBAR_ALWAYS 水平スクロールバーが常に表示されるように
水平スクロールバーポリシーを設定します
HORIZONTAL_SCROLLBAR_AS_NEEDED 水平スクロールバーが必要なときにだけ表示されるように
水平スクロールバーポリシーを設定します
HORIZONTAL_SCROLLBAR_NEVER 水平スクロールバーが表示されないように
水平スクロールバーポリシーを設定します
VERTICAL_SCROLLBAR_ALWAYS 垂直スクロールバーが常に表示されるように
垂直スクロールバーポリシーを設定します
VERTICAL_SCROLLBAR_AS_NEEDED 垂直スクロールバーが必要なときにだけ表示されるように
垂直スクロールバーポリシーを設定します
VERTICAL_SCROLLBAR_NEVER 垂直スクロールバーが表示されないように
垂直スクロールバーポリシーを設定します

この定数を設定することで、常にスクロールバーを表示することもできます
import java.awt.*;
import javax.swing.*;

public class Test extends JApplet {
	Point temp;
	JViewport view = new JViewport();;

	public void init() {
		JLabel label = new JLabel(new ImageIcon("test.jpg"));
		JScrollPane scroll = new JScrollPane(label);

		getContentPane().add(scroll);
	}
}


このプログラムは、アイコンを表示するラベルをスクロールペインのビューに追加しています
アプレットのサイズを変更して、ラベルがビューに表示しきれなくなると
必要な水平、または垂直スクロールバーが表示されます


列ヘッダと行ヘッダ

スクロールペインは、さらに上部と左部にヘッダコントロールを追加することができます
これは、スクロールに対して現在の位置やビューの情報を伝えるのに適しています

多くの場合、列や行ヘッダには定規のように論理サイズを表示する
独自のパネルやラベルコンポーネントを追加することになるでしょう
列ヘッダの追加は JScrollPane.setColumnHeaderView()
行ヘッダの追加は JScrollPane.setRowHeaderView() メソッドで行います

public void setColumnHeaderView(Component view)
public void setRowHeaderView(Component view)

スクロールペインは、与えられたコンポーネントを専用のビューに追加し
ビューのサイズに合わせて、これを上部と左部に追加します
import java.awt.*;
import javax.swing.*;

public class Test extends JApplet {
	JViewport view = new JViewport();
	public void init() {
		JLabel label1 = new JLabel(new ImageIcon("test.jpg"));

		JScrollPane scroll = new JScrollPane(label1);
		scroll.setColumnHeaderView(new RulerPanel());
		scroll.setRowHeaderView(new RulerPanel(SwingConstants.VERTICAL));

		getContentPane().add(scroll);
	}
}

class RulerPanel extends JPanel implements SwingConstants  {
	private int orientation = HORIZONTAL;

	public RulerPanel() {}
	public RulerPanel(int orientation) {
		this.orientation = orientation;
	}
	public void paintComponent(Graphics g) {
		if (orientation == VERTICAL) {
			for(int i = 5 ; i < getSize().height ; i += 5) {
				g.drawLine(0 , i , 5 , i);
			}
		}
		else {
			for(int i = 5 ; i < getSize().width ; i += 5)
				g.drawLine(i , 0 , i , 5);
		}
	}
}


これが、列ヘッダと行ヘッダを追加した状態のスクロールペインです
RulerPanel は、5 ピクセル単位に線を描画する単純な定規クラスです
再描画処理を省略しているため、完全ではありませんがこのような形になるでしょう



前のページへ戻る次のページへ