Domanda

Domanda semplice:

Una cornice oscillante può essere completamente modale (bloccare tutte le altre finestre)?

Ho provato quanto segue, ma posso ancora fare clic sulle finestre di altre app (come questo browser)

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

Se possibile, incolla del codice.

È stato utile?

Soluzione

JFrame non è progettato per essere modale. Usa JDialog per questo, ma perderai alcune funzionalità di JFrame. Se non riesci a convivere con la perdita, devi bloccare EventQueue e sostituirlo con il tuo per accettare solo eventi da quello di blocco.

Vedi Creazione di frame interni modali per una spiegazione usando i frame interni questo dovrebbe essere applicabile anche a JFrame.

Modifica: Oups, la mia risposta sembra un po 'off, dal momento che il tuo esempio di codice mostra che stai già utilizzando una sottoclasse Dialog per questo.

Altri suggerimenti

Le finestre di dialogo non sono pensate per essere globalmente modali. Ogni sistema operativo moderno scoraggia fortemente la modalità globale nel suo HIG e potrebbe persino aver deprecato la funzionalità (come indicato dal fatto che non è possibile farlo funzionare). La tua app non dovrebbe mai rubare eventi da tutto il sistema; non è solo un cattivo design, è quasi criminale nel mio libro.

Ignorando il fatto che alla maggior parte delle persone piace multi-task tra diverse app, che dire dello scenario in cui si apre una finestra di dialogo modale a livello globale e l'applicazione si blocca? Ctrl + Alt + Canc dovrebbe funzionare su Windows per uccidere l'app, ma non sono sicuro di Cmd + Opt + Escape su Mac con una finestra di dialogo a livello globale (Cocoa ha anche modalità globale?). Nessuna delle piattaforme Linux ha un buon modo per uccidere le app che hanno assunto il controllo completo dell'interfaccia utente come stai suggerendo (dovresti uccidere X11 completamente e avviare una nuova istanza da zero).

La mia risposta: trova un altro modo. Non mi interessa ciò che il tuo cliente sta chiedendo, non lo vogliono.

Non conosco il modale globale, ma ecco un'idea.

  1. Prendi lo screenshot del desktop.
  2. Passa a schermo intero.
  3. Apri la finestra di dialogo.

Poiché il desktop è uno screenshot falso, puoi ignorare qualsiasi tentativo di fare clic su di esso.

Esempio di schermo intero :

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: API in modalità esclusiva a schermo intero .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top