Проверка появления строки на экране перед принудительной прокруткой к ней? - PullRequest
7 голосов
/ 01 мая 2010

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

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

1 Ответ

2 голосов
/ 01 мая 2010

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

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