我正在使用Swing JTable,我想强制滚动到其中的特定行。使用 scrollRowToVisible(...)这很简单,但是我想首先检查这个行在滚动到它之前是否已经在屏幕上看不到,好像它已经可见,没有必要强制滚动。
我该怎么做?
答案 0 :(得分:2)
以下链接指向确定单元格是否可见的文章。您可以使用它 - 如果单元格可见,则该行可见。 (当然,如果水平滚动也存在,可能不是整行。)
但是,我认为当单元格比视口宽时,这将失败。要处理这种情况,请更改测试以检查单元格边界的顶部/底部是否在视口的垂直范围内,但忽略单元格的左/右部分。最简单的方法是将矩形的左边和宽度设置为0.我还将方法改为仅采用行索引(不需要列索引),如果表不在,则返回true
视口,似乎与您的用例更好地对齐。
public boolean isRowVisible(JTable table, int rowIndex)
{
if (!(table.getParent() instanceof JViewport)) {
return true;
}
JViewport viewport = (JViewport)table.getParent();
// This rectangle is relative to the table where the
// northwest corner of cell (0,0) is always (0,0)
Rectangle rect = table.getCellRect(rowIndex, 1, true);
// The location of the viewport relative to the table
Point pt = viewport.getViewPosition();
// Translate the cell location so that it is relative
// to the view, assuming the northwest corner of the
// view is (0,0)
rect.setLocation(rect.x-pt.x, rect.y-pt.y);
rect.setLeft(0);
rect.setWidth(1);
// Check if view completely contains the row
return new Rectangle(viewport.getExtentSize()).contains(rect);
}