Нетипизированные события поддерживались в RAP?

Я разрабатываю приложение на основе RCP. Недавно я перевел его на RAP. Раньше я использовал некоторые нетипизированные события в RCP для передачи некоторых необходимых данных для разных целей. Например, у меня есть кнопка "Получить данные" для получения данных с сервера. У меня есть просмотрщик таблиц для хранения данных, полученных с сервера. Когда пользователь нажимает эту кнопку, я хочу вызвать событие, и в каждой таблице будет прослушиваться это событие. Я сделал следующее:

//Part 1

Button btgetData=new Button(compositeLabels,SWT.PUSH);
        btgetData.setText("Get Data");
        btgetData.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                //raise event here
                Event event =new Event();
                event.detail=12345;
            getRoot().getShell().notifyListeners(MYEVENTCONST, event);
            }           
        });

//Part 2: 
//In each composite that hold TableViewer , listen event

getShell().addListener(MYEVENTCONST, new Listener() 
            public void handleEvent(Event event) {
      if(event.detail==12345)
              doProcessing();               
        });

В RCP каждый TableViewer обычно прослушивает это событие каждый раз, когда пользователь нажимает кнопку «Получить данные». Но это не сработало на RAP, я не знаю, поддерживал ли уже RAP такие нетипизированные события. Функция doProcessing() никогда не вызывается :(.

Я не хочу менять способ передачи данных. Пожалуйста, дайте мне знать, если я могу продолжать работать по-старому. Я очень признателен за любой комментарий.


person zungnv    schedule 10.01.2012    source источник


Ответы (1)


Пользовательские типы событий в настоящее время не поддерживаются в RAP (в основном из-за ошибки 334028. ).

Однако, хотя вы можете сделать это в SWT, я бы посчитал это неправильным использованием событий SWT. Это может быть приемлемо для пользовательского виджета, но эти методы зарезервированы для событий на уровне виджета, пока вы используете их на уровне приложения. Кроме того, в JavaDoc Widget#notifyListeners() и Widget#addListener() четко указано:

Тип события — одна из констант события, определенных в классе SWT.

Вместо использования пользовательского события вы можете позволить своим композитам реализовывать собственный интерфейс:

public interface ProcessingControl {

  void doProcessing();

}

и определите метод обновления, который рекурсивно обходит дочерние элементы композита:

static void updateChildren( Composite parent ) {
  for( Control child : parent.getChildren() ) {
    if( child instanceof ProcessingControl ) {
      ( ( ProcessingControl )child ).doProcessing();
    }
    if( child instanceof Composite ) {
      updateChildren( ( Composite )child );
    }
  }
}

Затем вы можете позвонить updateChildren( shell );.

Если вы предпочитаете использовать события и прослушиватели, вам следует использовать java.util.EventObject и EventListener для своих целей.

person ralfstx    schedule 12.02.2012