сохранение выбора JTable в окне просмотра - PullRequest
0 голосов
/ 18 марта 2009

Я использую GlazedLists для автоматической генерации EventTableModel из EventList для использования с JTable в JScrollbarPane.

Я использую EventList в качестве FIFO, группа элементов добавляется в конец, затем группа элементов иногда удаляется с самого начала. Когда элементы удаляются, выбор работает точно так, как я ожидаю: даже если индекс выбора изменился, будут выбраны те же элементы (или, по крайней мере, те, которые все еще находятся в таблице). Это здорово.

Очевидно, что если объекты изменяют свои индексы из-за удаления элементов в начале, невозможно сохранить область просмотра, показывающую фиксированный диапазон объектов и фиксированный диапазон индексов. Поведение по умолчанию, кажется, сохраняет видовой экран тем же.

Если бы я хотел сохранить выбранные объекты в одном и том же месте в области просмотра, есть ли способ, которым я могу это сделать? (например, настроить прослушиватель событий на EventTableModel или JScrollbarPane или что-то еще, и вычислить правильную настройку полосы прокрутки, чтобы при удалении элементов с начала область просмотра перемещалась вместе с объектами?)

Ответы [ 3 ]

1 голос
/ 30 июля 2009

если я вызываю правильно, на JComponent есть метод, который используется JViewport которая выполняет фактическую прокрутку при использовании клавиш со стрелками в Jtable

public void scrollRectToVisible(Rectangle aRect)

таким образом вам не нужно настраивать полосы прокрутки, но вы можете указать, какой прямоугольник должен быть виден. Может включать в себя некоторые расчеты на основе номера строки и высоты пикселя одной строки. Вы также можете установить точку останова в этом методе и проверить, как он работает при перемещении клавиш со стрелками через Jtable

0 голосов
/ 18 февраля 2014

Вот еще одно решение, зависящее только от таблицы. Это решение также сохраняет позицию y выбранной строки в новом представлении.

Сначала мы хотим сохранить предварительно обновленный вид и прямоугольники выбора

Rectangle preUpdateViewRect = table.getVisibleRect();
Rectangle preUpdateSelectedCellRect = table.getCellRect( table.getSelectedRow(), 1, true );

После обновления проверьте, был ли наш выбор в поле зрения. Эта проверка гарантирует, что если пользователь выберет строку и начнет прокрутку, мы не вернем представление назад к выделению. Если выделение было в нашем представлении, выполните простую математическую процедуру, чтобы создать прямоугольник, в котором выделение находится в том же месте в нашем представлении.

if( preUpdateViewRect != null && preUpdateViewRect.contains( preUpdateSelectedCellRect ))
{
    Rectangle postUpadteSelectedCellRect = table.getCellRect( table.getSelectedRow(), 1, true );
    int newViewPortY = postUpdateSelectedCellRect.y - ( preUpdateSelectedCellRect.y - preUpdateViewRect.y );
    Rectangle newViewRect = new Rectangle( preUpdateViewRect.x, newViewPortY , preUpdateViewRect.width, preUpdateViewRect.height );
    table.scrollRectToVisible( newViewRect );
}
0 голосов
/ 14 июня 2010

Другой способ показать первую выбранную строку в JTable, которая находится внутри ScrollPane, - вручную установить то, что показывает вертикальная полоса прокрутки:

Итак, сначала получите первую выбранную строку в таблице. Если выбрано несколько строк, это все равно будет просто захватить первую строку.

int firstSelectedRow = table.getSelectedRow();

Затем найдите, где (координата Y) выбранной строки находится в таблице.

Rectangle cellLocation = table.getCellRect(firstSelectedRow, 0, false);

Наконец, мы можем сказать вертикальной полосе прокрутки, где находиться.

scrollPane.getVerticalScrollBar().setValue(cellLocation.y);

Кроме того, если выбранных строк нет, в окне просмотра будет отображаться верх таблицы.

Я бы предпочел использовать метод scrollRectToVisible (), но по какой-то причине он не работал для меня и, похоже, работает каждый раз.

...