如何询问JTable中的选定行是否可见?

问题描述

我有这个功能

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);
  1. 如果选定的行位于视口的上方,则视口将滚动,因此该行位于视口的顶部。
  2. 如果所选行在视口下方,则视口将被滚动,因此该行在视口下方。
  3. 如果所选行在视口中已经可见,则不会进行滚动。