Глобальное модальное приложение Swing

Простой вопрос:

Может ли поворотная рама быть полностью модальной (блокировать все остальные окна)?

Я пробовал следующее, но все еще могу щелкать окна других приложений (например, этот браузер)

JDialog myDialog  = .... 
myDialog.setModalityType(Dialog.ModalityType.APPLICATION_MODAL);

Пожалуйста, вставьте код, если это возможно.

вы нашли решение для этого? Мне это тоже нужно. Глобальный диалог, блокирующий любое взаимодействие с пользователем. Мне это нужно, потому что я создаю предупреждение, которое пользователь ДОЛЖЕН просмотреть и закрыть

Mistre83 22.03.2015 14:13

@ Mistre83, что тогда было невозможно, и я предполагаю, что это до сих пор невозможно. Итак, нет, я не нашел решения.

OscarRyz 23.03.2015 16:23
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
1 031
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Я не знаю о глобальных модальных окнах, но вот идея.

  1. Сделайте снимок экрана рабочего стола.
  2. Перейти в полноэкранный режим.
  3. Всплывающее диалоговое окно.

Поскольку рабочий стол является фальшивым снимком экрана, вы можете игнорировать любую попытку щелкнуть по нему.

Полноэкранный образец:

private void toggleFullScreenWindow() {
  GraphicsEnvironment graphicsEnvironment
    = GraphicsEnvironment.getLocalGraphicsEnvironment();
  GraphicsDevice graphicsDevice
    = graphicsEnvironment.getDefaultScreenDevice();
  if (graphicsDevice.getFullScreenWindow()==null) {
    dialog.dispose(); //destroy the native resources
    dialog.setUndecorated(true);
    dialog.setVisible(true); //rebuilding the native resources
    graphicsDevice.setFullScreenWindow(dialog);
  }else{
    graphicsDevice.setFullScreenWindow(null);
    dialog.dispose();
    dialog.setUndecorated(false);
    dialog.setVisible(true);
    dialog.repaint();
  }
  requestFocusInWindow();
}

К вашему сведению: API полноэкранного эксклюзивного режима.

ммм ... может быть .. может быть .. Я попробую и посмотрю, не моргнет ли. Спасибо.

OscarRyz 20.11.2008 20:24

Зачем вы так обманываете своих пользователей?

Matt Green 20.11.2008 20:31
Ответ принят как подходящий

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

См. Создание модальных внутренних рамок для объяснения использования внутренних фреймов, которые также должны быть применимы к JFrame.

Редактировать: Упс, мой ответ кажется немного неправильным, поскольку ваш пример кода показывает, что вы уже используете для этого подкласс Dialog.

Виноват. Я не ставил код инициализации. Да, я начал с JFrame, затем немного погуглил и переключился на JDialog. Дело здесь не в том, чтобы блокировать окна приложений, а во всех окнах ОС.

OscarRyz 20.11.2008 20:06

Диалоги не должны быть глобально модальными. Каждая современная ОС настоятельно не одобряет глобальную модальность в своей HIG, и они, возможно, даже не рекомендуют эту функциональность (на что указывает тот факт, что вы не можете заставить ее работать). Ваше приложение должно никогда красть события из всей системы; это не только плохой дизайн, это почти преступление в моей книге.

Игнорируя тот факт, что большинству людей нравится выполнять несколько задач между несколькими приложениями, как насчет сценария, когда вы открываете глобально модальное диалоговое окно, а затем ваше приложение зависает? Ctrl + Alt + Del должен работать в Windows, чтобы убить приложение, но я не уверен в Cmd + Opt + Escape на Mac с глобально модальным диалоговым окном (имеет ли Cocoa даже глобальную модальность имеют?). Ни на одной из платформ Linux нет хорошего способа убить приложения, которые взяли на себя полный контроль над пользовательским интерфейсом, как вы предлагаете (вам придется полностью убить X11 и запустить новый экземпляр с нуля).

Мой ответ: найди другой способ. Мне все равно, что просит ваш клиент, они этого не хотят.

Другие вопросы по теме