问题描述
private static void autoScrollToRow(JTable table) {
JViewport viewport = (JViewport) table.getParent();
Rectangle cellRectangle = table.getCellRect(table.getSelectedRow(),true);
Rectangle visibleRectangle = viewport.getVisibleRect();
table.scrollRectToVisible(new Rectangle(cellRectangle.x,cellRectangle.y,(int) visibleRectangle.getWidth(),(int) visibleRectangle.getHeight()));
}
,此函数以这种方式滚动,即当前选中的行在tableView中位于第一位。如何编辑此功能,以便仅在看不到所选行时才滚动?
(类似于if(table.sellectedRowVisibleOnScreen(true))
)
解决方法
您的方法中已经有两个可以测试的矩形。
private static void autoScrollToRow(JTable table) {
JViewport viewport = (JViewport) table.getParent();
Rectangle cellRectangle = table.getCellRect(table.getSelectedRow(),true);
Rectangle visibleRectangle = viewport.getVisibleRect();
if (!visibleRectangle.contains(cellRectangle)) {
int width = (int) visibleRectangle.getWidth();
int height = (int) visibleRectangle.getHeight();
table.scrollRectToVisible(new Rectangle(
cellRectangle.x,cellRectangle.y,width,height));
}
}
,
如何编辑此功能,以便仅在看不到所选行时才滚动?
您没有做任何特别的事情。
这是scrollToRect(...)
方法的默认行为(正如我在评论中所述)。
您所需的方法是:
Rectangle cellRectangle = table.getCellRect(table.getSelectedRow(),true);
table.scrollRectToVisible(cellRectangle);
- 如果选定的行位于视口的上方,则视口将滚动,因此该行位于视口的顶部。
- 如果所选行在视口下方,则视口将被滚动,因此该行在视口下方。
- 如果所选行在视口中已经可见,则不会进行滚动。