Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java RAP中是否支持非类型化事件?_Java_Events_Eclipse Rcp_Jface_Eclipse Rap - Fatal编程技术网

Java RAP中是否支持非类型化事件?

Java RAP中是否支持非类型化事件?,java,events,eclipse-rcp,jface,eclipse-rap,Java,Events,Eclipse Rcp,Jface,Eclipse Rap,我正在开发一个基于RCP的应用程序。最近,我把它改成了说唱。以前,我在RCP中使用了一些非类型化事件来传递用于不同目的的一些必要数据。 例如,我有一个名为“获取数据”的按钮从服务器获取数据。我有一些tableviewer来保存从服务器接收的数据。当用户单击此按钮时,我想引发一个事件,并且在每个表中都将侦听该事件。我是这样做的: //Part 1 Button btgetData=new Button(compositeLabels,SWT.PUSH); btgetData.se

我正在开发一个基于RCP的应用程序。最近,我把它改成了说唱。以前,我在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()函数:(


我不想更改传递数据的方式。请告诉我是否可以继续使用旧的方式。我非常感谢您的评论。

RAP中目前不支持自定义事件类型(主要原因是)

但是,尽管您可以在SWT中这样做,但我认为这是对SWT事件的误用。对于自定义小部件,它可能是可接受的,但是这些方法是在应用程序级别上使用它们时在WIDGET级别上保留的。明确指出:

事件类型是类
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