SWT FormToolkit фокус проблемы - PullRequest
0 голосов
/ 09 ноября 2011

У меня странная проблема: существует SectionPart с составным элементом, который создается из FormToolkit # createComposite (getSection ()). Composite содержит некоторое количество виджетов, которые расположены вертикально один под другим (как в обычной форме). Когда курсор находится внутри какого-то виджета, скажем, input filed, и я щелкаю правой кнопкой мыши между двумя полями в пустом пространстве, затем фокус автоматически переходит к первому полю в этом композите.

Я пытался установить бит стиля SWT.NO_FOCUS для первого виджета в форме (обычно это TableComboViewer), но это не помогло (кажется, этот бит не установлен в TableCombo, который находится внутри TableComboViewer).

Итак, кто-нибудь сталкивался с чем-то подобным, или есть какие-то обходные пути для этой проблемы или какие-либо подсказки, что это может быть?

Upd1: установка стиля NO_FOCUS помогает для не виджетов TableComboViewer (в этом случае они не получают фокус). В случае TableComboViewer виджет TableCombo содержит текстовый виджет, который получает фокус, но даже, если я добавлю бит NO_FOCUS, он не будет применен к стилю текста. Я проверил источник TableCombo и есть метод checkStyle, который делает следующее:

private static int checkStyle (int style) {
 int mask = SWT.BORDER | SWT.READ_ONLY | SWT.FLAT | SWT.LEFT_TO_RIGHT | SWT.RIGHT_TO_LEFT;
 return SWT.NO_FOCUS | (style & mask);
}

На самом деле я не уверен, что он делает, потому что я не очень хорош в побитовом режиме, но кажется, что это проблема, почему я не могу установить флаг NO_FOCUS.

Я не понимаю, однако, почему, когда я нажимаю на Composite, он пытается установить фокса на своих детей, я могу как-то подавить это?

Upd2: причина, вероятно, найдена, говорят, что:

Когда вид активирован, фокус переносится в форму, которая передает его первому элементу управления, способному принимать фокус, в данном случае наша ссылка.

И кажется, что это невозможно запретить.

Заранее спасибо, AlexG

1 Ответ

1 голос
/ 09 ноября 2011

Ваша проблема заключается в Composite.setFocus() .. посмотрите на это:

public boolean setFocus () {
    checkWidget ();
    Control [] children = _getChildren ();
    for (int i= 0; i < children.length; i++) {
        if (children [i].setFocus ()) return true;
    }
    return super.setFocus ();
} 

Как вы можете видеть, это попытается установить фокус на первом элементе управления в композите, который позволитфокус ...

[РЕДАКТИРОВАТЬ - для уточнения добавлено следующее ...]

Приведенный выше метод не был бы проблемой, если бы не было для MouseListener, то естьустановлен на все Composites в FormToolkit.adapt(Composite composite):

    public void adapt(Composite composite) {
        composite.setBackground(colors.getBackground());
        composite.addMouseListener(new MouseAdapter() {
            public void mouseDown(MouseEvent e) {
                ((Control) e.widget).setFocus();
            }
        });
        if (composite.getParent() != null)
            composite.setMenu(composite.getParent().getMenu());
    }

Я несколько раз решал эту проблему, имея свой собственный FormToolkit.adapt(Composite composite) в подклассе, который делает правильные вещи - я простообмен setFocus() с forceFocus().Хотя это может иногда вызывать другие проблемы ...

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