2015-06-01 2 views
0

Я пытаюсь программным образом определить, когда пользователь щелкнул флажок в CheckboxTreeViewer, и когда он нажал на фактический объект в дереве (т. Е. Элемент, отображаемый непосредственно справа от checkbox)Дифференциация между CheckboxTreeViewers CheckStateListener и Selection Listener

Чтобы определить, когда флажок установлен или снят флажок, я использую CheckStateListener. Это работает так, как ожидалось.

Чтобы определить, был ли объект нажат, я попытался использовать как приемник выбора, так и прослушиватель mousedown. Обе записи указывают, что объект был нажат, как и ожидалось. Однако они также записываются, когда флажок установлен или снят. Я не могу сказать, какое действие (щелкнув по флажку или нажав на объект) заставил слушателя стрелять.

Есть ли лучший способ определить, на что нажал пользователь?

Спасибо!

EDIT. Это текущий код, я тестирование с (добавлено к событию SWT.MouseDown):

private Listener getTestListener() { 
    return new Listener() { 
     @Override 
     public void handleEvent(final Event event) { 
      final ViewerCell vc = treeViewer.getCell(new 
       Point(event.x, event.y)); 
      if (vc != null) { 
       IStructuredSelection selection = 
        (IStructuredSelection)treeViewer.getSelection(); 
       Object selObj = selection.getFirstElement(); 

       final Object element = vc.getElement(); 

       // When I click on the checkbox or on the item 
       // to the right of it, the selObj and element 
       // Objects are always the same 
      } 
     } 
    }; 
} 

Также протестирована с Select: . TreeViewer.getTree() addSelectionListener (getTestListener2()); ...

private SelectionListener getTestListener2() { 
    return new SelectionListener() { 
     @Override 
     public void widgetSelected(SelectionEvent e) { 
      IStructuredSelection selection = (IStructuredSelection)treeViewer.getSelection(); 
      Object selObj = selection.getFirstElement(); 
     } 

     @Override 
     public void widgetDefaultSelected(SelectionEvent e) { 
     } 
    }; 
} 

Который также дал те же результаты, между е и selObj

UPDATE:

я должен был сделать ужасающую обходной путь, где я получаю значение event.x, уровень узел дерева и выполнить математическую задачу, специфичную для ОС, чтобы определить, была ли указатель мыши над флажком или нет. Я хочу, чтобы был лучший способ ...

+0

одна вещь, которая поможет является анализ исходного объекта события от события действия. – swingMan

+0

Я сделал это через отладчик, и я не могу найти соответствующую информацию. Есть ли у вас какие-либо особенности, о которых вы можете знать? – ekjcfn3902039

ответ

0

Если вы выбрали текущий выбор из таблицы, а не событие изменения выбора, которое, похоже, не изменится, когда событие выбора для этого флажка.

Таким образом, он будет пустым или ранее выбранным элементом и не будет соответствовать выбранному вами событию.

Это тестирование на Mac OS X. Я не уверен, что это относится ко всем платформам.

Вы можете получить текущую выборку из дерева или таблицы просмотра что-то вроде:

IStructuredSelection selection = (IStructuredSelection)viewer.getSelection(); 

Object selObj = selection.getFirstElement(); 
+0

Как узнать, когда нужно проверить текущий выбор из таблицы? Я бы предположил, что это потребует слушателя? – ekjcfn3902039

+0

Кроме того, я не уверен, где находится таблица ... В настоящее время я устанавливаю слушателя через treeViewer.getTree(). AddListener(). Это не дает мне желаемых результатов. – ekjcfn3902039

+0

Нет, вы просто вызываете 'treeViewer.getSelection()' –

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