FocusTraversalPolicyを使用してフォーカスを取得したコンポーネントまでスクロールする
Total: 5561, Today: 1, Yesterday: 2
Posted by aterai at
Last-modified:
Summary
FocusTraversalPolicyを使用してフォーカスをもつコンポーネントを取得し、その全体が表示されるまでスクロールします。
Screenshot

Advertisement
Source Code Examples
Box box = Box.createVerticalBox();
box.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
IntStream.range(0, 20).forEach(i -> {
box.add(new JTextField("test" + i));
box.add(Box.createVerticalStrut(5));
});
box.add(Box.createVerticalGlue());
box.setFocusCycleRoot(true);
box.setFocusTraversalPolicy(new LayoutFocusTraversalPolicy() {
@Override public Component getComponentAfter(
Container focusCycleRoot, Component aComponent) {
Component c = super.getComponentAfter(focusCycleRoot, aComponent);
if (focusCycleRoot instanceof JComponent) {
((JComponent) focusCycleRoot).scrollRectToVisible(c.getBounds());
}
return c;
}
@Override public Component getComponentBefore(
Container focusCycleRoot, Component aComponent) {
Component c = super.getComponentBefore(focusCycleRoot, aComponent);
if (focusCycleRoot instanceof JComponent) {
((JComponent) focusCycleRoot).scrollRectToVisible(c.getBounds());
}
return c;
}
});
add(new JScrollPane(box));
View in GitHub: Java, KotlinDescription
上記のサンプルでは、JScrollPane内に配置されているコンポーネントにフォーカスが移動した場合、そのコンポーネント全体が表示されるようにスクロールを行うFocusTraversalPolicyを作成しています。
- 左:
Default- 表示範囲外にある
JTextFieldにTabキーなどでフォーカスが移動しても自動的にスクロールしない
- 表示範囲外にある
- 右:
LayoutFocusTraversalPolicy#getComponentAfter(...)LayoutFocusTraversalPolicy#getComponentAfter(...)メソッドなどをオーバーライドしてフォーカスを取得するコンポーネントを取得し、JComponent#scrollRectToVisible(...)メソッドでそのコンポーネントの領域が表示されるまでスクロールを実行
Reference
- JTextFieldを編集不可のJTextPaneに追加する
- 同様に
JComponent#scrollRectToVisible(...)を使用しているが、こちらはFocusListenerを各JTextFieldに設定している
- 同様に
- Scrolling a Form « Java Tips Weblog