事件以什么顺序传递给SWT中的Widgets及其子项

时间:2015-05-07 00:04:55

标签: java user-interface swt

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

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

1 个答案:

答案 0 :(得分:1)

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)。如果按钮的边界重新出现,鼠标按下事件将传递给按钮(并且仅传递给按钮)。在按钮外部发生的鼠标按下事件将传递到命令行管理程序。

SWT有显示过滤器以收听特定类型的所有事件。事件首先被传递到显示过滤器,然后传递给特定的小部件,如果没有被过滤的过滤器。

如果您要向Display添加一个鼠标按下的监听器,它会收到所有鼠标按下事件的通知,并且还可以通过将事件的doit字段设置为{{}来否决该事件。 1}}。

false

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