Моя постоянная работа заключается в разработке SWT (для Linux), я надеюсь, что смогу дать исчерпывающий ответ:
С точки зрения кода SWT (по крайней мере, на GTK), естьтолько 3 табличных функции, которые влияют на прокрутку с помощью внутреннего собственного вызова gtk_tree_view_scroll_to_*()
setTopIndex();
showSelection();
showColumn();
Чтобы объяснить, что они делают и как их использовать:
Вертикальная прокрутка
Этоэто делается путем установки фокуса или выбора определенного элемента таблицы.
Для таблицы:
setTopIndex(int) // Btw for Tree it's setTopItem(..)
showSelection() // which is also reached via setSelection().
setTopIndex (int) перемещает представление программно в нужное положение.
Ниже приведена модифицированная версия [Snippet52] [1], которая выполняет требуемое задание:
public static void main (String [] args) {
Display display = new Display ();
Shell shell = new Shell (display);
Table table = new Table (shell, SWT.BORDER | SWT.MULTI);
Rectangle clientArea = shell.getClientArea ();
table.setBounds (clientArea.x, clientArea.y, 200, 200);
for (int i=0; i<128; i++) {
TableItem item = new TableItem (table, SWT.NONE);
item.setText ("Item " + i);
}
table.setTopIndex(95); // <<<< This is the interesting line.
shell.pack ();
shell.open ();
while (!shell.isDisposed ()) {
if (!display.readAndDispatch ()) display.sleep ();
}
}
showSelection () с другой стороны, прокручивает представление дотекущий выбранный пункт.Этот метод также вызывается различными setSelection(..)
методами.
Т.е. setSelection(..)
обычно используется для прокрутки до нужного элемента и установки на нем фокуса клавиатуры.Это полезно, если вы ищете элемент в дереве и хотите, чтобы пользовательский ввод (например, «ввод») воздействовал на найденный вами элемент.Snippet52 (упомянутый выше) выполняет эту задачу.
Теперь стоит отметить, что setSelection (..) не вызывает selectionListeners (...), поэтому вызов этого метода не вызовет связанное действие.
Горизонтальная прокрутка
Это делается путем фокусировки на определенном столбце с помощью функции 'showColumn ()'.
Ниже приведен пример фрагмента, который создает несколько строк и столбцов и затем прокручивается до последнего столбца.
public static void main (String [] args) {
Display display = new Display ();
Shell shell = new Shell (display);
Table table = new Table (shell, SWT.BORDER | SWT.MULTI);
table.setHeaderVisible (true);
Rectangle clientArea = shell.getClientArea ();
table.setBounds (clientArea.x, clientArea.y, 100, 100);
String[] titles = {"First", "Second", "Third", "Fourth", "Fifth"};
for (int i=0; i<titles.length; i++) {
TableColumn column = new TableColumn (table, SWT.NONE);
column.setText (titles [i]);
}
for (int i=0; i<128; i++) {
TableItem item = new TableItem (table, SWT.NONE);
item.setText (new String [] {"" + i, ""+i, ""+i, ""+i});
}
for (int i=0; i<titles.length; i++) {
table.getColumn (i).pack ();
}
shell.pack ();
shell.open ();
display.asyncExec(
// Sometimes table column sizes are computed later at runtime,
// to get around it, set the column index after initialization.
() -> table.showColumn(table.getColumn(4))
);
while (!shell.isDisposed ()) {
if (!display.readAndDispatch ()) display.sleep ();
}
display.dispose ();
}
Примечание к деревьям и спискам
Внутри SWT все дерево / таблица / список используют один и тот же родной виджет "Дерево".
Приведенные выше примеры можно использовать для списков и таблиц какну, с разницей:
- в дереве,
setTopIndex(..)
равно setTopItem(..)
. - Списки не имеют столбцов, поэтому showColumn () не применяется.
Дайте мне знать, если у вас есть дополнительные вопросы.