2011-01-14 2 views
4

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

tableViewer.getTable().setSelection(lastSelectedIndices); 

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

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

Любая помощь очень ценится!

--code для создания таблицы -

 // 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)); 
      } 
     } 
    }); 
} 

ответ

1

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

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

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

+0

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

 Смежные вопросы

  • Нет связанных вопросов^_^