модальный JDialog без родителей не захватывает фокус - PullRequest
1 голос
/ 20 февраля 2012

У нас есть приложение, которое в качестве первого действия пользовательского интерфейса отображает модальный JDialog без родительского фрейма.

public LoginDialog(Frame owner, Config config, Object... params) {
    super((Frame)null, true);

У него, к сожалению, есть досадная особенность: когда он появляется, хотя и выходит вперед, он не захватывает фокус.

Таким образом, пользователь, после запуска приложения, дважды щелкнув по меню «Пуск», должен использовать мышь, чтобы выбрать диалоговое окно «Логин» и ввести информацию.

Есть ли способ заставить этот JDialog захватывать фокус, когда он появляется спереди?

Я пробовал вызывать «requestFocus» до, после и через invokeLater «во время» вызова setVisible (true) - но, похоже, ни один из них не имеет никакого эффекта.

Как сделать так, чтобы модальное диалоговое окно захватывало фокус?

ОБНОВЛЕНИЕ: проблема заключалась в коде, используемом для того, чтобы попытаться представить фоновое «окно ожидания». Это окно отображалось «позади» диалогового окна входа в систему как хак, чтобы после исчезновения диалогового окна пользователь мог видеть сообщение «Пожалуйста, подождите». Поскольку это было первое окно, созданное приложением, оно получило фокус. Я не уверен, что был бы способ заставить диалог снова получить фокус в потоке диспетчеризации событий с помощью этого хака - но я исправил его, сняв его и сделав все правильно.

Ответы [ 3 ]

2 голосов
/ 20 февраля 2012

Во-первых, немного странно, что модальное диалоговое окно не имеет родительских прав. Суть в модальном диалоговом окне заключается в том, что он отображается на родительском элементе и не позволяет получить доступ к родительскому элементу.

Итак, первая рекомендация - сделать его немодальным. Я верю, что это сработает.

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

    JDialog d = new JDialog();
    d.setSize(200, 200);
    d.setVisible(true);

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

Если ничто не помогает, попробуйте использовать трюк, описанный в этой статье . Ищите заголовок «Активация переносимого окна». Надеюсь, это поможет.

2 голосов
/ 20 февраля 2012

См. Dialog Focus для возможного исправления с использованием RequestFocusListener. Я успешно использовал его для настройки фокуса в JOptionPane диалогах.

1 голос
/ 20 февраля 2012

1) вам нужно создать JDialog содержимое и показать контейнер, завернутый в invokeLater()

или самый лучший и безопасный способ -

2) вы должны установить для ModalityTypes или Modal для родителя

3) только один из контейнеров может быть Modal в жизненном цикле приложений

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