0

我正在开发一个基于 RCP 的应用程序。最近,我已将其移至 RAP。之前,我在 RCP 中使用了一些无类型的事件来传递一些必要的数据以用于不同的目的。例如,我有一个名为“获取数据”的按钮来从服务器获取数据。我有一些 tableviewer 来保存从服务器接收到的数据。当用户单击此按钮时,我想引发一个事件,并且在每个表中都会监听该事件。我做了如下:

//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() :(。

我不想在传递数据时改变方式。请让我知道我是否可以继续以旧方式前进。我非常感谢您的任何评论。

4

1 回答 1

0

RAP 目前不支持自定义事件类型(主要是由于错误 334028)。

但是,尽管您可以在 SWT 中这样做,但我认为这是对 SWT 事件的滥用。自定义小部件可能是可以接受的,但是当您在应用程序级别使用它们时,这些方法是为小部件级别的事件保留的。Widget#notifyListeners()此外, and的 JavaDocWidget#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.EventObjectandEventListener来达到你的目的。

于 2012-02-12T19:35:30.580 回答