Похоже, мой ответ слишком поздний, и, возможно, мое решение было невозможно в 2009 году ... Но в любом случае я отправляю его.
Эту проблему можно решить с помощью Display.addFilter
. Вы должны добавить фильтр для события перемещения где-то в начале вашей программы.
Display.getDefault().addFilter( SWT.Traverse, new Listener() {
@Override
public void handleEvent( Event event ) {
if( SWT.TRAVERSE_RETURN == event.detail ) {
System.out.println( "Global SWT.TRAVERSE_RETURN" );
event.doit = false;
}
};
} );
Позже вы создаете диалог, и его кнопка по умолчанию не работает:
Shell shell = new Shell( SWT.DIALOG_TRIM | SWT.APPLICATION_MODAL );
shell.setLayout( new GridLayout( 2, false ) );
shell.setSize( 250, 100 );
Label loginLabel = new Label( shell, SWT.NONE );
loginLabel.setLayoutData( new GridData( SWT.LEFT, SWT.CENTER, false, false ) );
loginLabel.setText( "Login" );
Text text = new Text( shell, SWT.BORDER );
text.setLayoutData( new GridData( SWT.FILL, SWT.CENTER, true, false ) );
Composite buttonsContentComposite = new Composite( shell, SWT.NONE );
buttonsContentComposite.setLayoutData( new GridData( SWT.FILL, SWT.FILL, true, false, 2, 1 ) );
buttonsContentComposite.setLayout( new GridLayout( 2, false ) );
Button okButton = new Button( buttonsContentComposite, SWT.PUSH );
okButton.setLayoutData( new GridData( SWT.RIGHT, SWT.CENTER, true, false ) );
okButton.setText( "Ok" );
okButton.addSelectionListener( new SelectionAdapter() {
@Override
public void widgetSelected( SelectionEvent e ) {
System.out.println( "Ok" );
};
} );
Button cancelButton = new Button( buttonsContentComposite, SWT.PUSH );
cancelButton.setLayoutData( new GridData( SWT.LEFT, SWT.CENTER, false, false ) );
cancelButton.setText( "Cancel" );
cancelButton.addSelectionListener( new SelectionAdapter() {
@Override
public void widgetSelected( SelectionEvent e ) {
System.out.println( "Cancel" );
};
} );
shell.setDefaultButton( okButton );
shell.open();
while (!shell.isDisposed()) {
if( !Display.getCurrent().readAndDispatch() ) {
Display.getCurrent().sleep();
}
}
Фильтр перехватывает событие обхода и запрещает отправку его в оболочку, поэтому кнопка по умолчанию не будет работать.
Но у этого решения есть один нюанс - вы можете добавить прослушиватель Traverse для оболочки и переопределить эффект глобального фильтра:
shell.addTraverseListener( new TraverseListener() {
@Override
public void keyTraversed( TraverseEvent event ) {
event.doit = true;
}
} );
Это событие включения прослушивателя, и сработает кнопка по умолчанию.