Pergunta

Pergunta simples:

Pode um quadro de balanço ser completamente modal (bloquear todas as outras janelas)?

Eu tentei o seguinte, mas eu ainda pode clicar em outros aplicativos do Windows (como este browser)

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

Plase colar algum código se isso é possível.

Foi útil?

Solução

JFrame não é projetado para ser modal. Use JDialog para isso, mas você vai perder algumas funcionalidades JFrame fazê-lo. Se você não pode viver com a perda, você tem que bloquear a EventQueue e substituí-lo com seu próprio para aceitar apenas os eventos de um bloqueio.

Consulte Criando Modal Frames Interno para uma explicação usando molduras internas que deveria ser aplicável a JFrame também.

Edit: Oups, a minha resposta parece um pouco fora, uma vez que seus exemplo de código mostra que você já está usando uma subclasse de diálogo para isso.

Outras dicas

Os diálogos não são destinadas a ser globalmente modal. Cada sistema operacional moderno desencoraja fortemente modalidade global em seu HIG, e eles podem até ter desaprovado a funcionalidade (como indicado pelo fato de que você não pode obtê-lo para o trabalho). Seu aplicativo deve não roubar eventos de todo o sistema; que não é apenas mau design, que é quase criminoso no meu livro.

Ignorando o fato de que a maioria das pessoas gostam de multi-tarefa entre vários aplicativos, que sobre o cenário em que você abrir uma globalmente modal de diálogo e, em seguida, seus congela aplicação? Ctrl + Alt + Del deve funcionar no Windows para matar o aplicativo, mas não tenho certeza sobre Cmd + Opt + Escape no Mac com uma globalmente modal de diálogo (faz Cacau mesmo Have modalidade global?). Nenhuma das plataformas Linux tem alguma boa maneira de matar aplicativos que tomaram o controle completo da interface do usuário, como você está sugerindo (você teria que matá-X11 completamente e iniciar uma nova instância a partir do zero).

A minha resposta:.. encontrar uma outra maneira Não me importa o que seu cliente está pedindo, eles não querem que este

Eu não sei sobre modal global, mas aqui está uma ideia.

  1. Tome a imagem da área de trabalho.
  2. Go tela cheia.
  3. Pop up seu diálogo.

Uma vez que o ambiente de trabalho é falsa imagem, você pode ignorar qualquer tentativa de clicar nele.

amostra tela cheia :

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();
}

FYI: Full-Tela modo exclusivo API .

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top