• 追加された行はこの色です。
  • 削除された行はこの色です。
TITLE:JScrollPane内にあるJTableなどで追加した行が可視化されるようにスクロールする
#navi(../)
RIGHT:Posted by [[aterai]] at 2012-09-10
RIGHT:Posted by &author(aterai); at 2012-09-10
*JScrollPane内にあるJTableなどで追加した行が可視化されるようにスクロールする [#i0ec10e7]
JScrollPaneのJViewport内にあるJTable、JList、JTreeで、それぞれ追加された最終行が可視化されるようにスクロールします。

-&jnlp;
-&jar;
-&zip;

//#screenshot
#ref(https://lh3.googleusercontent.com/-t_4BD1mGUGk/UE1eF0Ead3I/AAAAAAAABSM/4a4aPSpMDM4/s800/ScrollRectToVisible.png)

**サンプルコード [#kcb0b4e6]
#code(link){{
model.addRow(new Object[] {date.toString(), model.getRowCount(), false});
int i = table.convertRowIndexToView(model.getRowCount()-1);
Rectangle r = table.getCellRect(i, 0, true);
table.scrollRectToVisible(r);
}}

**解説 [#h5ca79e3]
- JTable
-- 追加した行の0列目のセル領域を取得して、scrollRectToVisibleで可視化
-- ソートやフィルターが使用されている場合を考慮して、追加した行のインデックスをJTable#convertRowIndexToView(int)で変換してから、セル領域を取得している
-- ソートやフィルターが使用されている場合を考慮して、追加した行のインデックスをJTable#convertRowIndexToView(int)で変換してから、セル領域を取得

- JList
-- [http://docs.oracle.com/javase/jp/6/api/javax/swing/JList.html#ensureIndexIsVisible(int) JList#ensureIndexIsVisible(int)]を使って、追加した最終行を可視化(このメソッド内部でscrollRectToVisibleを使用)
#code{{
Rectangle cellBounds = list.getCellBounds(index, index);
if(cellBounds != null) {
  list.scrollRectToVisible(cellBounds);
}
}}

- JTree
-- [http://docs.oracle.com/javase/jp/6/api/javax/swing/JTree.html#scrollRowToVisible(int) JTree#scrollRowToVisible(int)], [http://docs.oracle.com/javase/jp/6/api/javax/swing/JTree.html#scrollPathToVisible(javax.swing.tree.TreePath) JTree#scrollPathToVisible(TreePath)]で追加した最終行を可視化
-- [http://docs.oracle.com/javase/jp/6/api/javax/swing/JTree.html#scrollRowToVisible(int) JTree#scrollRowToVisible(int)]、または[http://docs.oracle.com/javase/jp/6/api/javax/swing/JTree.html#scrollPathToVisible(javax.swing.tree.TreePath) JTree#scrollPathToVisible(TreePath)]で追加した最終行を可視化
-- tree.scrollRowToVisible(row) は tree.scrollPathToVisible(tree.getPathForRow(row)) と同等
-- JTree#scrollPathToVisible(TreePath)は内部で、tree.scrollRectToVisible(tree.getPathBounds(path))を使用
#code{{
DefaultTreeModel treeModel = (DefaultTreeModel)tree.getModel();
DefaultMutableTreeNode parent   = (DefaultMutableTreeNode)treeModel.getRoot();
DefaultMutableTreeNode newChild = new DefaultMutableTreeNode(date);
treeModel.insertNodeInto(newChild, parent, parent.getChildCount());
/* //tree.scrollRowToVisible(row) == tree.scrollPathToVisible(tree.getPathForRow(row))
tree.scrollRowToVisible(tree.getRowCount()-1);
/*/
tree.scrollPathToVisible(new TreePath(newChild.getPath()));
//*/
}}

**参考リンク [#pf4abfe7]
- [[JScrollPaneのViewPortをマウスで掴んでスクロール>Swing/HandScroll]]
-- JComponent#scrollRectToVisible(...)を使用してスクロール
- [[JTextPaneで最終行に移動>Swing/CaretPosition]]
-- キャレットの移動でスクロール

**コメント [#x0728da5]
#comment