假设我有一个包含按钮的面板。我向Panel添加了一个DragMove侦听器,因此我可以在其任何部分拖动移动面板。但是,当我按下按钮时,我不希望出现相同的行为。有没有办法做到这一点?
在Qt中,事件传递层次结构清晰,您可以在所需的任何层中停止进一步处理事件。但我似乎无法找到类似的SWT机制。这是否存在优雅的解决方案?
答案 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
如果您认为某个特定用例需要事件层次结构,请告诉我们。