ScrollBar / Синхронизация положения таблицы в Java SWT turorial
Возможно, если вы хотите отключить полосу прокрутки, это означает, что вы хотите синхронизировать контент с чем-то другим. Вот пример того, как это сделать с двумя таблицами, где содержимое основной таблицы с именем tableExcel отражается в дополнительной таблице с именем tableRow (пожалуйста, учтите, что код может быть не идеальным, потому что я новичок):
* Примечание: код не завершен и показывает только ключевые вещи (для начинающих, пожалуйста, используйте Window Builder, а затем отредактируйте / добавьте код):
1) Как упоминалось ankur.trapasiya, сделайте следующее:
tableRow = new Table(sashFormExcel, SWT.BORDER | SWT.VIRTUAL | SWT.NO_SCROLL);
2) И (SWT.VIRTUAL потребуется, чтобы сделать обходной путь, и для быстрой загрузки таблиц он загрузит то, что вы видите и куда вы прокручиваете)
tableExcel = new Table(sashFormExcel, SWT.BORDER | SWT.VIRTUAL);
3) Поскольку я использовал sash-форму для лучшей навигации, вставьте это выше пункт 1:
SashForm sashFormExcel = new SashForm(sashForm_Main, SWT.NONE);
4) Затем реализовать это (после пункта 3):
synchronizer synchronize = new synchronizer(tableRow, tableExcel); tableExcel.getVerticalBar().addSelectionListener(synchronize);
5) Добавьте этот класс (синхронизирует позицию содержимого таблиц):
class synchronizer implements SelectionListener<br>
{<br>
Table t1, t2;
public synchronizer(Table tableRow, Table tableMain)
{
t1 = tableRow;
t2 = tableMain;
}
@Override
public void widgetSelected(SelectionEvent e) {
t1.setTopIndex(t2.getTopIndex());
}
@Override
public void widgetDefaultSelected(SelectionEvent e) {
// TODO Auto-generated method stub
}
}
6) И после пункта 2 добавьте это (это позволит быстро загрузить основную таблицу, а также синхронизирует вашу таблицу с отключенной полосой прокрутки):
tableExcel.addListener( SWT.SetData, new Listener() {
public void handleEvent( Event event ) {
TableItem item = (TableItem) event.item;
int index = event.index;
int page = index / PAGE_SIZE;
int start = page * PAGE_SIZE;
int end = start + PAGE_SIZE;
end = Math.min (end, virtTableExcel.size());
for (int i = start; i < end; i++) {
item = tableExcel.getItem (i);
item.setText (virtTableExcel.get(i));
tableRow.getItem(i).setText(Integer.toString(i));
}
}
});
И поверх кода добавьте это:
private static Table tableExcel;
ArrayList<String[]> virtTableExcel = new ArrayList<String[]>();
final int PAGE_SIZE = 64;
private Table tableRow;
Как упомянуто в пункте 7, вы берете данные из списка массивов virtTableExcel, но чтобы вызвать точку 6, используйте это (где-то в коде, после того как вы сгенерировали virtTableExcel с данными), где rowMax - целое число, которое равно к virtTableExcel.size (); : tableExcel.setItemCount(rowMax);
tableRow.setItemCount(rowMax);
Пожалуйста, не вините меня за код, я использовал его из своего приложения. Но все эти биты могут быть полезны для других начинающих.