JTable прокрутка до указанного индекса строки - PullRequest
45 голосов
/ 12 мая 2009

У меня есть JTable, который находится в пределах JScrollPane.. Строки добавляются в таблицу во время выполнения на основе событий, которые происходят в моем приложении. Я хочу, чтобы панель прокрутки прокручивалась до нижней части таблицы при добавлении в таблицу новой строки.

Для JLists Существует [ensureIndexIsVisible][1](), который заставляет определенный индекс в списке быть видимым. Я ищу то же самое, но для JTable. Похоже, мне, возможно, придется вручную перемещать вид прокрутки на панели прокрутки, но я подумал, что должен быть более простой способ.

Ответы [ 5 ]

69 голосов
/ 03 июня 2011

Это очень просто, JTable также имеет метод scrollRectToVisible. Если вы хотите, вы можете попробовать что-то вроде этого, чтобы прокрутить панель вниз, если добавлена ​​новая запись:

jTable1.getSelectionModel().setSelectionInterval(i, i);
jTable1.scrollRectToVisible(new Rectangle(jTable1.getCellRect(i, 0, true)));

Где i - последняя добавленная запись.

35 голосов
/ 12 мая 2009

См. Этот пример: http://www.exampledepot.com/egs/javax.swing.table/Vis.html

обновление: ссылка теперь устарела, вот код (из http://smi -protege.stanford.edu / repos / protege / protege-core / trunk / src / edu / stanford / smi / protege / util / ComponentUtilities.java )

public static void scrollToVisible(JTable table, int rowIndex, int vColIndex) {
        if (!(table.getParent() instanceof JViewport)) {
            return;
        }
        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, vColIndex, 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);

        table.scrollRectToVisible(rect);

        // Scroll the area into view
        //viewport.scrollRectToVisible(rect);
    }
5 голосов
/ 12 мая 2009

JList внутренне использует scrollRectToVisible и задает координаты для прокрутки. Я думаю, вам придется перекодировать аналогичный функционал для JTable.

1 голос
/ 12 марта 2013

Первый ответ работает хорошо, но выбранная строка располагается внизу таблицы. Поэтому я создал эту модифицированную версию:

private void scrollToVisible(int rowIndex, int vColIndex ) {
        JTable table = getTablePanel().getTable();
        if (!(table.getParent() instanceof JViewport)) {
            return;
        }
        if (table.getRowCount()<1){
            return;
        }
        JViewport viewport = (JViewport)table.getParent();
        // view dimension
        Dimension dim = viewport.getExtentSize();
        // cell dimension
        Dimension dimOne = new Dimension(0,0);

        // This rectangle is relative to the table where the
        // northwest corner of cell (0,0) is always (0,0).
        Rectangle rect = table.getCellRect(rowIndex, vColIndex, true);
        Rectangle rectOne;
        if (rowIndex+1<table.getRowCount()) {
            if (vColIndex+1<table.getColumnCount())
                vColIndex++;
            rectOne = table.getCellRect(rowIndex+1, vColIndex, true);
            dimOne.width=rectOne.x-rect.x;
            dimOne.height=rectOne.y-rect.y;
        }

        // '+ veiw dimension - cell dimension' to set first selected row on the top

        rect.setLocation(rect.x+dim.width-dimOne.width, rect.y+dim.height-dimOne.height);

        table.scrollRectToVisible(rect);
    }

Теперь выбранная строка располагается в верхней части таблицы.

0 голосов
/ 21 ноября 2013

Мне кажется, намного проще установить положение окна просмотра, чем прокручивать стол. Ниже приведен мой код.

public void scrollCellToView(int rowIndex, int vColIndex) {
    if (!(this.getParent() instanceof JViewport)) {
        return;
    }
    JViewport viewport = (JViewport) this.getParent();
    Rectangle rect = this.getCellRect(rowIndex, vColIndex, true);
    Rectangle viewRect = viewport.getViewRect();

    int x = viewRect.x;
    int y = viewRect.y;

    if (rect.x >= viewRect.x && rect.x <= (viewRect.x + viewRect.width - rect.width)){

    } else if (rect.x < viewRect.x){
        x = rect.x;
    } else if (rect.x > (viewRect.x + viewRect.width - rect.width)) {
        x = rect.x - viewRect.width + rect.width;
    }

    if (rect.y >= viewRect.y && rect.y <= (viewRect.y + viewRect.height - rect.height)){

    } else if (rect.y < viewRect.y){
        y = rect.y;
    } else if (rect.y > (viewRect.y + viewRect.height - rect.height)){
        y = rect.y - viewRect.height + rect.height;
    }

    viewport.setViewPosition(new Point(x,y));
}
...