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

How to ask if selected row in JTable is visible?

我有这个功能

private static void autoScrollToRow(JTable table) {
      JViewport viewport = (JViewport) table.getParent();
        Rectangle cellRectangle = table.getCellRect(table.getSelectedRow(), 0, 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(), 0, 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));
    }
}

How to edit this function so it only do scrolling if selected row is out of sight?

你没有做任何特别的事情。

这是 scrollToRect(...) 方法的默认行为(正如我在评论中解释的那样)。

您的方法只需要:

Rectangle cellRectangle = table.getCellRect(table.getSelectedRow(), 0, true);
table.scrollRectToVisible(cellRectangle);
  1. 如果所选行位于视口顶部上方,则视口将滚动,因此该行位于顶部。
  2. 如果所选行在视口下方,则视口将滚动,因此该行位于底部。
  3. 如果所选行已在视口中可见,则不会进行滚动。