Вопрос

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

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

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

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

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

Это было полезно?

Решение

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

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

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

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

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

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

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

Я не знаю о глобальном модале, но вот идея. <Ол>

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

    Полноэкранный пример :

    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 полноэкранного эксклюзивного режима .

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top