Проверка, появляется ли строка на экране перед прокруткой силы к нему?

Я использую JTable Swing, и я хочу вызвать прокрутку к определенной строке в нем. Это - простое использование scrollRowToVisible (...), но я хочу сначала проверить, что эта строка не уже видима на экране прежде, чем прокрутить к нему, как будто это уже видимо нет никакой потребности вызвать прокрутку.

Как я могу сделать это?

7
задан Kai 24 April 2013 в 12:08
поделиться

1 ответ

Ссылка ниже на статью, которая определяет, видна ли ячейка. Вы можете использовать это - если ячейка видна, то и строка видна. (Но, конечно, возможно, не весь ряд, если горизонтальная прокрутка также присутствует.)

Однако я думаю, что это не сработает, если ячейка шире области просмотра. Чтобы справиться с этим случаем, измените тест, чтобы он проверял, находится ли верхняя/нижняя часть границ ячейки в пределах вертикальной границы области просмотра, но игнорировал левую/правую часть ячейки. Проще всего установить левую часть и ширину прямоугольника равными 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); 
} 
2
ответ дан 7 December 2019 в 18:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: