FocusTraversalPolicyを使用してフォーカスを取得したコンポーネントまでスクロールする
Total: 4791
, Today: 3
, Yesterday: 7
Posted by aterai at
Last-modified:
概要
FocusTraversalPolicy
を使用してフォーカスをもつコンポーネントを取得し、その全体が表示されるまでスクロールします。
Screenshot
Advertisement
サンプルコード
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, Kotlin解説
上記のサンプルでは、JScrollPane
内に配置されているコンポーネントにフォーカスが移動した場合、そのコンポーネント全体が表示されるようにスクロールを行うFocusTraversalPolicy
を作成しています。
- 左:
Default
- 表示範囲外にある
JTextField
にTabキーなどでフォーカスが移動しても自動的にスクロールしない
- 表示範囲外にある
- 右:
LayoutFocusTraversalPolicy#getComponentAfter(...)
LayoutFocusTraversalPolicy#getComponentAfter(...)
メソッドなどをオーバーライドしてフォーカスを取得するコンポーネントを取得し、JComponent#scrollRectToVisible(...)
メソッドでそのコンポーネントの領域が表示されるまでスクロールを実行
参考リンク
- JTextFieldを編集不可のJTextPaneに追加する
- 同様に
JComponent#scrollRectToVisible(...)
を使用しているが、こちらはFocusListener
を各JTextField
に設定している
- 同様に
- Scrolling a Form « Java Tips Weblog