Event 在 SWT 中以什么顺序传递给 Widgets 及其 Children

In what order is Event delivered to Widgets and its Children in SWT

假设我有一个包含按钮的面板。我向面板添加了一个 DragMove 侦听器,这样我就可以在面板的任何部分拖动移动面板。但是,当我按下按钮时,我不希望出现相同的行为。有办法吗?

在 Qt 中,事件传递层次结构清晰,您可以停止在任何层进一步处理事件。但我似乎无法为 SWT 找到类似的机制。是否存在一个优雅的解决方案?

SWT 中没有事件层次结构。一个事件被传送到为它注册了一个侦听器的小部件。

下面的代码片段说明了这一点:

public static void main( String[] args ) {
  Listener listener = new Listener() {
    @Override
    public void handleEvent( Event event ) {
      System.out.println( event );
    }
  };
  Display display = new Display();
  Shell shell = new Shell( display );
  shell.setText( "Shell" );
  shell.addListener( SWT.MouseDown, listener );
  Button button = new Button( shell, SWT.PUSH );
  button.setText( "Button" );
  button.setBounds( 100, 100, 400, 100 );
  button.addListener( SWT.MouseDown, listener );
  shell.setSize( 600, 600 );
  shell.open();
  while( !shell.isDisposed() ) {
    if( !display.readAndDispatch() )
      display.sleep();
  }
  display.dispose();
}

它将一个按钮放置在父窗口小部件中(在本例中为 Shell)。如果鼠标按下事件发生在按钮的边界重新排列内,则鼠标按下事件将传递给按钮(并且仅传递给按钮)。在按钮外部发生的鼠标按下事件将传送到 Shell。

SWT 有显示过滤器 来侦听所有 某种类型的事件。如果 none o 过滤器被否决,事件首先传递给显示过滤器,然后传递给特定的小部件。

如果您要向 Display 添加鼠标按下侦听器,它将收到所有鼠标按下事件的通知,并且还可以通过将事件的 doit 字段设置为来否决该事件false.

Display display = new Display();
Listener filter = new Listener() {
  @Override
  public void handleEvent( Event event ) {
    if( /* condition */ ) {
      event.doit = false;
    }
  }
};
display.addFilter( SWT.MouseDown, filter );

如果您有您认为需要事件层次结构的特定用例,请告诉我们。