глобально отключить клавишу ввода / возврата в диалоге SWT - PullRequest
3 голосов
/ 26 июня 2009

Я создал класс диалога, заполняющий некоторые общие виджеты, такие как текст, комбо и дерево. Раздражает поведение по умолчанию для закрытия этого диалогового окна (такое же, как при нажатии кнопки «ОК» по умолчанию) при нажатии ввода / возврата в зависимости от того, какой виджет у меня был.

Чтобы предотвратить такое поведение, я должен добавить прослушиватель хода для каждого виджета, чтобы отфильтровать ключ перемещения:

if (SWT::TRAVERSE_RETURN == event.detail) {
  event.doit = false 
}

Это несколько раздражает. Есть ли способ глобально сделать на уровне диалога?

Ответы [ 5 ]

3 голосов
/ 16 апреля 2012

Я обнаружил, что в диалоговом окне JFace легко отключить ключ ввода по умолчанию, переопределив метод createButtonsForButtonBar.

и последний параметр:

createButton (parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, ложь);

должно быть ложным:

@Override
protected void createButtonsForButtonBar(Composite parent) {
Button button = createButton(parent, IDialogConstants.OK_ID,
        IDialogConstants.OK_LABEL, false);
}
0 голосов
/ 19 октября 2013

Похоже, мой ответ слишком поздний, и, возможно, мое решение было невозможно в 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;
    }
} );

Это событие включения прослушивателя, и сработает кнопка по умолчанию.

0 голосов
/ 26 июня 2009

Возможно, вы могли бы установить для кнопки по умолчанию значение null (Shell # setDefaultButton (null)), чтобы предотвратить поведение для всего диалогового окна, в противном случае, я думаю, вам придется выделить виджеты, где вы хотите нажать клавишу Enter.

0 голосов
/ 21 октября 2011

Мое решение этой проблемы, которая, кажется, работает до сих пор, состоит в том, чтобы создать невидимую отключенную кнопку и установить ее в качестве кнопки оболочки по умолчанию. Чтобы не мешать остальной части макета, я создал кнопку на панели кнопок диалогового окна, используя родительский элемент, переданный в createButtonsForButtonBar().

    final Button hiddenButton = new Button(parent, SWT.PUSH);
    hiddenButton.setVisible(false);
    hiddenButton.setEnabled(false);
    parent.getShell().setDefaultButton(hiddenButton);

Теперь все события выбора по умолчанию нажимают эту кнопку. Который, как хотелось бы, ничего не делает.

0 голосов
/ 26 июня 2009

Согласно этой теме , это, кажется, единственный способ, также проиллюстрированный Snippet127 ("предотвратить выход Tab из контроля")

Может быть, этот Dialog класс иллюстрирует глобальное использование TraverseListener с их keyTraversed() методом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...