JScrollPaneは、 他のペインにスクロールバーを付けることが出来る。
/** * スクロール機能付きペインの初期化 */ private void initPane(Container c) { JEditorPane editor = new JEditorPane(); 〜 JScrollPane scroll = new JScrollPane(editor); c.add(scroll); }
スクロールバーの有無を指定する例。[2007-02-22]
JScrollPane scroll = new JScrollPane(pane, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, //縦 ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED); //横
AS_NEEDED | 必要に応じて表示される。 |
NEVER | 常に表示されない。 |
ALWAYS | 常に表示される。 |
縦だけスクロールさせて横のサイズは可変(ウィンドウの最大幅で固定)にするような場合、getPreferredSize()が「最小の(必要な)サイズ」を返すようにしないと、 スクロールバーが更新されない。[2007-05-13]
つまり、ウィンドウサイズが変更された時にgetPreferredSize()が呼ばれ、必要とするサイズが取得される。これとウィンドウのサイズが比較され、レイアウトの変更が必要かどうか判断される。
必要と判断されるとlayout()が呼ばれる(サイズに応じてスクロールバーが変更される)。
(必要でないと判断されるとlayout()が呼ばれない為、スクロールバーは変更されない)
layout()は非推奨メソッドになっており、doLayout()に置き換えられたようだ。
しかしdoLayout()の実装は、「layout()を呼び出す」だけ。layout()が無くなるのなら、逆にlayout()の実装が「doLayout()の呼び出し」になるべきだと思うんだけどな〜?
コーナー(隅)にコンポーネントをセットし、自由に描画することが出来る。[2009-03-14]
コーナーというのは、スクロールバーとヘッダーエリアの隙間など。以下のような部分。
UL | 列ヘッダー | UR | ||
行 ヘ ッ ダ |
内容 | △ | ||
□ □ □ |
||||
▽ | ||||
LL | < | □□□ | > | LR |
位置 | 説明 | 設定メソッド | 取得メソッド |
---|---|---|---|
内容 (列ヘッダー) |
スクロールさせるペイン(コンポーネント)本体 | new
JScrollPane(コンポーネント) setViewportView(コンポーネント) |
getViewport().getView() |
列ヘッダー | 列ヘッダー(上側の見出し) JTableの場合、内容本体が兼ねる。 |
setColumnHeaderView(コンポーネント) | getColumnHeader().getView() |
行ヘッダー | 行ヘッダー(左側の見出し) | setRowHeaderView(コンポーネント) | getRowHeader().getView() |
UL | 左上コーナー | setCorner(ScrollPaneConstants.UPPER_LEFT_CORNER, コンポーネント) | getCorner(位置) |
UR | 右上コーナー | setCorner(ScrollPaneConstants.UPPER_RIGHT_CORNER, コンポーネント) | |
LL | 左下コーナー | setCorner(ScrollPaneConstants.LOWER_LEFT_CORNER, コンポーネント) | |
LR | 右下コーナー | setCorner(ScrollPaneConstants.LOWER_RIGHT_CORNER, コンポーネント) |