Виджет таблицы Eclipse с SWT.CHECK запускает два события при выборе элемента таблицы

#java #events #eclipse-plugin #eclipse-cdt

#java #Мероприятия #eclipse-плагин #eclipse-cdt

Вопрос:

Я создаю плагин Eclipse (3.6.2) CDT (7.0.2), который использует мою собственную страницу мастера (расширение MBSCustomPage). На этой странице мастера отображается таблица, заполненная некоторыми элементами таблицы, которые можно проверить или снять, щелкнув по ним (как обычно). Проблема в том, что я всегда получаю два события, когда флажок TableItem установлен (или снят)!. В первом полученном событии у меня есть (SelectedEvent)e.detail == SWT.CHECK, даже если элемент таблицы был проверен первым, а во втором событии (SelectedEvent)e.detail == 0!. Поэтому у меня нет способа узнать, действительно ли элемент таблицы проверен или нет. Это мой код (в некоторой степени):

 final Table table = new Table( composite, SWT.BORDER | SWT.SINGLE | SWT.FULL_SELECTION | SWT.CHECK );
table.setHeaderVisible(true);
table.setLinesVisible(false);

(...)

table.addSelectionListener(new SelectionAdapter() {
    public void widgetSelected(SelectionEvent e) {
        CheckThatOnlyOneItemCanBeCheckedAtTime(e.item);
        //If someone check on me, save the item data value in a "container"
        if( e.detail == SWT.CHECK ) {
            MBSCustomPageManager.addPageProperty(PAGE_ID, "SDK_Path", ((ISdk)((TableItem)e.item).getData()).getPath() );
        } else { //Otherwise, unset the saved value
            MBSCustomPageManager.addPageProperty(PAGE_ID, "SDK_Path", "" );
        }
    }
});
  

Почему widgetSelected() вызывается два раза, когда я нажимаю на флажок элемента таблицы?
Я проверил, что события запускаются, даже если внутри метода widgetSelected() нет кода.
Я ничего не нашел в Google или в базе данных Eclipse Bugzilla… действительно странно для меня, но я не опытный программист плагинов Eclipse (даже Java) 🙂

Спасибо!

Ответ №1:

 table.addListener(SWT.Selection, new Listener() {
  public void handleEvent(Event arg0) {
    String string = arg0.detail == SWT.CHECK ? "Checked" : "Selected";
    if (arg0.detail == SWT.CHECK) {
      System.out.println(arg0.item   " "   string  ":"   
                         ((Table)arg0.widget).getSelection()[0].getChecked());
     }                         
     else {
       System.out.println(arg0.item   " "   string);
     }
   }
});
  

Комментарии:

1. Вместо этого используйте ((TableItem)arg0.item).getChecked() . Приведенный выше код может не разрешаться для проверяемого элемента, поскольку он ищет первый выбранный элемент (который может быть или не быть проверяемым элементом). Это приведет к исключению нулевого указателя (NPE), если элементы таблицы не выбраны (и никакие элементы не нужно выбирать, чтобы проверять / снимать элементы).