Как получить все видимые строки модели JTable в JScrollPane

Пока я знаю, как получить конкретную строку в точке, используя объект JViewPort JScrollPane.

scrollPane.getVerticalScrollBar().addAdjustmentListener(new AdjustmentListener() {

        @Override
        public void adjustmentValueChanged(AdjustmentEvent e) {
            JViewport viewport = scrollPane.getViewport();
            Point p = viewport.getViewPosition();
            int rowIndex = getLogsTable().rowAtPoint(p);
            System.out.println("Minimum Y: " + viewport.getViewRect().getMinY());
            System.out.println("Min row: " + getLogsTable().rowAtPoint(new Point(0, (int) viewport.getViewRect().getMinY())));
            System.out.println("Maximum Y: " + viewport.getViewRect().getMaxY());
            System.out.println("Max row: " + getLogsTable().rowAtPoint(new Point(0, (int) viewport.getViewRect().getMaxY())));
        }

    });

Мне трудно понять, как получить все строки между JViewport.getMinimumY() и JViewport.getMaximumY(). Есть ли способ собрать все элементы строки между этими двумя точками просмотра или есть ли способ просто получить все строки в представлении JScrollPane?


person cj5    schedule 27.08.2014    source источник
comment
Если вы хотите получить количество видимых строк в таблице, см. Ответ @kleopatra в этой теме: Сколько строк в настоящее время отображается в JTable?. Если вы хотите получить список всех видимых строк, этот ответ вам тоже поможет.   -  person dic19    schedule 27.08.2014
comment
Итак, должен ли я использовать количество строк для циклического перебора индексов строк?   -  person cj5    schedule 27.08.2014
comment
Нет, достаточно просто получить первую и последнюю строки. То, что находится посередине, можно вычислить. Например: первая строка 3, а последняя строка 7, тогда у вас есть {3,4,5,6,7}.   -  person dic19    schedule 27.08.2014
comment
Подозревая проблему XY, я спрашиваю: почему ты хочешь это знать?   -  person trashgod    schedule 28.08.2014
comment
Таблица произвольной модели предоставляет другую область графического интерфейса, которую я разрабатываю, с необязательными данными из этой модели. Поскольку в таблице потенциально может быть 1000 строк, я не хочу, чтобы все они были переданы в другую область. Только данные из видимых строк и других областей будут обновляться по мере прокрутки пользователем таблицы.   -  person cj5    schedule 28.08.2014
comment
@ dic19 dic19, если вы можете изменить свой комментарий на ответ, я бы хотел установить его в качестве принятого ответа. Я использовал зачатки ответа Клеопатры.   -  person cj5    schedule 29.08.2014


Ответы (1)


Основываясь на комментарии @dic19, я использовал этот фрагмент кода, и он сработал. Я только что добавил дополнительную переменную для обработки получения индекса последней строки.

// need to wait for table to fully load
    SwingUtilities.invokeLater(new Runnable() {

        @Override
        public void run() {

            // getLogsTable() returns JTable instance
            Rectangle vr = getLogsTable().getVisibleRect();
            int firstRow = getLogsTable().rowAtPoint(vr.getLocation());
            vr.translate(0, vr.height);
            int visibleRows = getLogsTable().rowAtPoint(vr.getLocation()) - firstRow;
            int lastRow = (visibleRows > 0) ? visibleRows+firstRow : getLogsTable().getRowCount();

            System.out.println("first visible row: " + firstRow + " last visible row: " + lastRow);

            for(int rowNum=firstRow+1; rowNum<=lastRow; rowNum++) {
                    // LogsModel is a AbstractTableModel instance
                    LogsModel model = (LogsModel) getLogsTable().getModel();
                    Log log = model.getData().get(getLogsTable().convertRowIndexToModel(rowNum-1));
                    System.out.println(log.getLocation());
            }

            System.out.println(lastRow);
        }

    });
person cj5    schedule 29.08.2014
comment
+1, потому что вы решили свою проблему самостоятельно и мудро использовали JTable#convertRowIndexToModel(). Держись в том же духе! - person dic19; 29.08.2014