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 );
如果您有您认为需要事件层次结构的特定用例,请告诉我们。
假设我有一个包含按钮的面板。我向面板添加了一个 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 );
如果您有您认为需要事件层次结构的特定用例,请告诉我们。