• category: swing folder: ScrollRectToVisible title: JScrollPane内にあるJTableなどで追加した行が可視化されるようにスクロールする tags: [JScrollPane, JViewport, JTable, JList, JTree] author: aterai pubdate: 2012-09-10T16:06:04+09:00 description: JScrollPaneのJViewport内にあるJTable、JList、JTreeで、それぞれ追加された最終行が可視化されるようにスクロールします。 description: JScrollPaneのJViewport内にあるJTable、JList、JTreeでそれぞれ追加された最終行が可視化されるようにスクロールします。 image: https://lh3.googleusercontent.com/-t_4BD1mGUGk/UE1eF0Ead3I/AAAAAAAABSM/4a4aPSpMDM4/s800/ScrollRectToVisible.png

概要

JScrollPaneJViewport内にあるJTableJListJTreeで、それぞれ追加された最終行が可視化されるようにスクロールします。

概要

JScrollPaneJViewport内にあるJTableJListJTreeでそれぞれ追加された最終行が可視化されるようにスクロールします。

サンプルコード

サンプルコード

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);
View in GitHub: Java, Kotlin

解説

解説

  • JTable
    • 追加した行の0列目のセル領域を取得して、scrollRectToVisibleで可視化
    • ソートやフィルタが使用されている場合を考慮して、追加した行のインデックスをJTable#convertRowIndexToView(int)で変換してから、セル領域を取得
    • JTable#scrollRectToVisible(Rectangle)を使用して追加した行の0列目のセル領域までスクロール
    • ソートやフィルタが使用されている場合を考慮して追加した行のインデックスをJTable#convertRowIndexToView(int)で変換してからセル領域を取得
  • JList#ensureIndexIsVisible(int)を使用して追加した最終行を可視化(このメソッド内部でscrollRectToVisibleを使用)
    Rectangle cellBounds = list.getCellBounds(index, index);
    if (cellBounds != null) {
      list.scrollRectToVisible(cellBounds);
    }
    
  • JTree
  • JTree#scrollRowToVisible(int)、またはJTree#scrollPathToVisible(TreePath)で追加した最終行を可視化
  • tree.scrollRowToVisible(row)tree.scrollPathToVisible(tree.getPathForRow(row))と同等
  • JTree#scrollPathToVisible(TreePath)は内部でtree.scrollRectToVisible(tree.getPathBounds(path))を使用している
    DefaultTreeModel treeModel = (DefaultTreeModel) tree.getModel();
    DefaultMutableTreeNode parent = (DefaultMutableTreeNode) treeModel.getRoot();
    DefaultMutableTreeNode newChild = new DefaultMutableTreeNode(date);
    treeModel.insertNodeInto(newChild, parent, parent.getChildCount());
    #spandel
    /* //tree.scrollRowToVisible(row) == tree.scrollPathToVisible(tree.getPathForRow(row))
    #spanend
    #spanadd
    /* // tree.scrollRowToVisible(row) == tree.scrollPathToVisible(tree.getPathForRow(row))
    #spanend
    tree.scrollRowToVisible(tree.getRowCount() - 1);
    /*/
    tree.scrollPathToVisible(new TreePath(newChild.getPath()));
    //*/
    

参考リンク

参考リンク

コメント

コメント