Как я могу установить выделение в таблице SWT, используя setSelection и установив раскрытие в false? - PullRequest
4 голосов
/ 14 января 2011

Я пытаюсь выбрать некоторые элементы в своей таблице, но я не хочу, чтобы они были раскрыты.Проблема в том, что вызов метода (см. Ниже) автоматически приводит к вызову 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));
            }
        }
    });
}

Ответы [ 2 ]

1 голос
/ 14 января 2011

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

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

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

0 голосов
/ 04 апреля 2018

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

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

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

...