Нетипизированные события были поддержаны в RAP? - PullRequest
0 голосов
/ 10 января 2012

Я разрабатываю приложение на основе 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 () никогда не вызывается: (.

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

1 Ответ

0 голосов
/ 12 февраля 2012

Пользовательские типы событий в настоящее время не поддерживаются в 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 для своих целей.

...