2016-04-05 2 views
0

Я пытаюсь выполнить множественный выбор элементов в SWT ListViewer на основе нажатия клавиши Ctrl. Я хочу различать выбор с помощью клавиши Ctrl и простого выбора в ListViewer. Я не могу найти способ увидеть, нажата ли клавиша Ctrl или выпущена. Я не вижу полезного дополнения к этому слушателю. Есть ли способ узнать выбор с помощью нажатия клавиши и отпускания на SWT ListViewer. Вот пример кода, который я пробовал.Как захватить клавишу Ctrl, нажмите и отпустите на SWT ListViewer

public class DummyListViewer { 

private ListViewer dummyViewer; 

    public DummyListViewer (Composite parent) { 
      dummyViewer = createListViewer(parent); 
     } 

     private ListViewer createListViewer(Composite parent) { 
      GridData data = new GridData(SWT.LEFT, SWT.LEFT, false, false); 
      ScrolledComposite scrolledParent = (ScrolledComposite) createScrolledComposite(parent, SWT.NONE); 
      final ListViewer dummyViewer= new ListViewer(scrolledParent, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL| SWT.MULTI); 
      dummyViewer.getList().addKeyListener(new CtrlKeyListener()); 
      dummyViewer.setContentProvider(new ListViewerContentProvider()); 
      dummyViewer.setLabelProvider(new ListViewerLabelProvider()); 
      scrolledParent.setContent(dummyViewer.getControl()); 
      scrolledParent.setMinSize(dummyViewer.getControl().computeSize(SWT.DEFAULT, SWT.DEFAULT)); 
      dummyViewer.getControl().setLayoutData(new GridData(SWT.LEFT, SWT.FILL, false, true)); 
      return dummyViewer; 
     } 

     private Composite createScrolledComposite(Composite parent, int style) { 
      ScrolledComposite scrolledComposite = new ScrolledComposite(parent, SWT.H_SCROLL | SWT.V_SCROLL); 
      scrolledComposite.setLayout(new GridLayout(1, false)); 
      GridData gridData = new GridData(SWT.FILL, SWT.FILL, true, true); 
      gridData.widthHint = 400; 
      gridData.heightHint = 700; 
      scrolledComposite.setLayoutData(gridData); 
      scrolledComposite.setExpandVertical(true); 
      scrolledComposite.setExpandHorizontal(true); 
      return scrolledComposite; 
     } 

     public void setInput(List<Object> input) { 
      filterViewer.setInput(input); 
     } 

     private class ListViewerContentProvider implements IStructuredContentProvider { 

      @Override 
      public void dispose() { 

      } 

      @Override 
      public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { 

      } 

      @Override 
      public Object[] getElements(Object inputElement) { 
       if (inputElement instanceof List) { 
        return ((List)inputElement).toArray(); 
       } 
       return null; 
      } 

     } 

     private ColumnViewerFilter filter; 



     private class ColumnViewerFilter extends ViewerFilter { 

      String value=""; //$NON-NLS-1$ 

      /** 
      * Constructor for ColumnViewerFilter to set the String on which 
      * the viewer has to be filtered on. 
      * @param value - String on which 
      * the viewer has to be filtered on. 
      */ 
      public ColumnViewerFilter(String value) { 
       this.value = value; 
      } 

      @Override 
      public boolean select(Viewer viewer, Object parentElement, Object element) { 
       if (value != null && value instanceof String && element instanceof String) { 
        if (value.equals(element)) 
         return true; 
       } 
       return false; 
      } 

     } 

     private class ListViewerLabelProvider extends ColumnLabelProvider { 

      @Override 
      public String getText(Object element) { 
       if(element instanceof String) 
        return (String)element; 
       return null; 
      } 

     } 



     private boolean CtrlkeyPressed = false; 
     private class CtrlKeyListener implements KeyListener{ 

      @Override 
      public void keyPressed(KeyEvent e) { 
      if (e.keyCode == SWT.CTRL) 
       CtrlkeyPressed = true; 

      } 

      @Override 
      public void keyReleased(KeyEvent e) { 
       if (e.keyCode == SWT.CTRL) 
       CtrlkeyPressed = false; 
      } 

     } 
    } 
+0

Я не вижу нигде, где вы делаете setInput в ListViewer. –

+0

Поскольку я создаю объект DummyListViewer в другом месте, я устанавливаю ввод после создания объекта DummyListViewer. Но неважно, этот код, похоже, работает. – Juseeth

ответ

0

Вы можете слушать ключевое событие, используя addKeyListener по контролю List, содержащейся в ListViewer:

viewer.getList().addKeyListener(new KeyListener() { 

    @Override 
    public void keyPressed(final KeyEvent e) 
    { 
    if (e.keyCode == SWT.CTRL) 
     // TODO control pressed 
    } 

    @Override 
    public void keyReleased(final KeyEvent e) 
    { 
    if (e.keyCode == SWT.CTRL) 
     // TODO control release 
    } 

}); 

Обратите внимание, что на некоторых платформах множественный выбор не использует ключ Ctrl. На Mac ключ используется (SWT.COMMAND).

+0

Я попытался добавить это, но он не вызван. – Juseeth

+0

Работает для меня. Измените свой вопрос и добавьте свой код. –

+0

Я добавил свой код. – Juseeth

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