Как я могу установить выбор в таблице swt, используя setSelection и установив значение false?

Я пытаюсь выбрать некоторые элементы в своей таблице, но НЕ хочу, чтобы они открывались. Проблема в том, что вызов метода (см. ниже) автоматически приводит к тому, что showSelected() вызывается внутри Table.class, а это не то, что мне нужно.

tableViewer.getTable().setSelection(lastSelectedIndices);

Я пытался установить выбор с помощью tableViewer, но по какой-то причине это не работает, например: tableViewer.setSelection(new StructuredSelection (lastSelectedIndices), false); эта строка кода ничего не выбирает.

Могу ли я в любом случае выбрать строки таблицы и НЕ заставлять их открываться? В моей системе мне нужно вызывать setSelection каждый раз после обновления сетки, чтобы пользователь не потерял выбранный элемент. Проблема возникает, когда пользователь прокручивает сетку вниз --> если в этот момент происходит обновление, сетка возвращается к тому месту, где находятся выбранные элементы. Это выглядит очень странно, когда пользователь прокручивает таблицу вниз, а полоса прокрутки внезапно поднимается вверх.

Любая помощь приветствуется!

--код для настройки таблицы --

     // add table viewer
    tableViewer = new TableViewer(this, SWT.MULTI | SWT.FULL_SELECTION | SWT.VIRTUAL);
    tableViewer.setUseHashlookup(true);
    tableViewer.addFilter(new GridPanelViewerFilter());
    tableViewer.setComparator(new GridPanelViewerComparator());
    tableViewer.setComparer(new GridPanelElementComparer());

    table = tableViewer.getTable();
    GridData tableGd = new GridData(SWT.FILL, SWT.FILL, true, true);
    table.setLayoutData(tableGd);
    table.setHeaderVisible(true);
    table.setLinesVisible(true);
    // set table font
    setTableFont();

    // listen to paint events for anti aliasing 
    table.addPaintListener( ...etcetc

---код для обновления таблицы --

        protected void refreshGrid() {
    if(!updateGrid) return;
    Display.getDefault().asyncExec(new Runnable() {

        @Override
        public void run() {
            try {
                // check if disposed
                if (isDisposed()) {
                    log.log(new Status(IStatus.ERROR, Activator.PLUGIN_ID, getClass().getName() + ": " + "Grid already disposed"));
                    return;
                }
                // refresh table
                table.setRedraw(false);
                try {                   
                    // get last selected indices from mouse down event
                    tableViewer.refresh(true, false);
                    if(lastSelectedIndices != null){
                        tableViewer.getTable().deselectAll();
                        tableViewer.getTable().select(lastSelectedIndices);
                    }

                } catch (Exception e) {
                    log.log(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
                            getClass().getName() + ": " + "Error at refresh table", e));
                }
                table.setRedraw(true);
                // process post grid refresh
                postGridRefresh();

            } catch (Exception e) {
                log.log(new Status(IStatus.ERROR, Activator.PLUGIN_ID, getClass().getName() + ": " + "Error during refresh grid", e));
            }
        }
    });
}

person codegurl    schedule 14.01.2011    source источник


Ответы (2)


Попробуйте использовать Table.select(indexes), чтобы предотвратить раскрытие.

Но использование TableViewer.refresh() должно фактически сохранить выбор. Просто дикая догадка, но, возможно, вы попробуете TableViewer.setUseHashlookup(true), прежде чем настраивать какой-либо ввод в TableViewer.

Вы используете ВИРТУАЛЬНЫЙ стол? Если это так, попробуйте сначала без флага VIRTUAL.

person the.duckman    schedule 14.01.2011
comment
Я использовал TableViewer.refresh() и TableViewer.setUseHashlookup(true), но выбор не сохраняется. Я попробовал предложенную вами строку, Table.select(indices), но это все равно приводит к прокрутке таблицы до выбранных индексов. Интересно, что этот метод не вызывает showSelection() внутри Table.class (в отличие от setSelection). Как вы думаете, какой-то другой класс / код вызывает раскрытие выбора? - person codegurl; 17.01.2011

Это всего лишь подсказка, но, возможно, она сработает для вас. Попробуйте использовать метод setSelection() следующим образом:

tableViewer.getTable().setSelection(lastSelectedIndices, false);

Последний параметр (логический) должен иметь значение true, если выделение должно быть видимым, и значение false в противном случае.

person f1v3    schedule 04.04.2018