Я использую JTable Swing, и я хочу вызвать прокрутку к определенной строке в нем. Это - простое использование scrollRowToVisible (...), но я хочу сначала проверить, что эта строка не уже видима на экране прежде, чем прокрутить к нему, как будто это уже видимо нет никакой потребности вызвать прокрутку.
Как я могу сделать это?
Ссылка ниже на статью, которая определяет, видна ли ячейка. Вы можете использовать это - если ячейка видна, то и строка видна. (Но, конечно, возможно, не весь ряд, если горизонтальная прокрутка также присутствует.)
Однако я думаю, что это не сработает, если ячейка шире области просмотра. Чтобы справиться с этим случаем, измените тест, чтобы он проверял, находится ли верхняя/нижняя часть границ ячейки в пределах вертикальной границы области просмотра, но игнорировал левую/правую часть ячейки. Проще всего установить левую часть и ширину прямоугольника равными 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);
}