2013-08-07 10 views
5

Sto lavorando a un progetto in cui vorrei chiudere un JOptionPane generico a livello di codice (non facendo fisicamente clic su alcun pulsante). Alla scadenza di un timer, desidero chiudere qualsiasi JOptionPane eventualmente aperto e riportare l'utente alla schermata di accesso del mio programma. Posso respingere l'utente correttamente, ma il JOptionPane rimane a meno che non clicchi fisicamente su un pulsante.Chiusura di un JOptionPane a livello di programmazione

Ho visto molti siti senza tanta fortuna. Una chiamata al metodo doClick() sulla "Red X" di JOptionPane non sembra possibile e utilizzando JOptionpane.getRootFrame(). Dispose() non funziona.

+0

E 'questo quello che stai cercando? http://stackoverflow.com/questions/7787499/how-can-i-dismiss-one-joptionpane-upon-emergence-of-another-joptionpane-in-the-g – GGrec

+0

in genere (anche se non necessariamente), un'opzione è mostrato in un JDialog modale, quindi c'è al massimo un'opzionePane aperta. – kleopatra

+0

@GGrec - Quella risposta è sulla strada giusta, ma trovo che il looping attraverso le finestre, come suggerito da kleopatra, funzioni molto meglio nel mio caso. Grazie! – Codester89

risposta

14

Tecnicamente, è possibile scorrere tutte le finestre dell'applicazione, controllo è che sono di tipo JDialog e hanno un figlio di tipo JOptionPane, e smaltire la finestra di dialogo in caso affermativo:

Action showOptionPane = new AbstractAction("show me pane!") { 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     createCloseTimer(3).start(); 
     JOptionPane.showMessageDialog((Component) e.getSource(), "nothing to do!"); 
    } 

    private Timer createCloseTimer(int seconds) { 
     ActionListener close = new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       Window[] windows = Window.getWindows(); 
       for (Window window : windows) { 
        if (window instanceof JDialog) { 
         JDialog dialog = (JDialog) window; 
         if (dialog.getContentPane().getComponentCount() == 1 
          && dialog.getContentPane().getComponent(0) instanceof JOptionPane){ 
          dialog.dispose(); 
         } 
        } 
       } 

      } 

     }; 
     Timer t = new Timer(seconds * 1000, close); 
     t.setRepeats(false); 
     return t; 
    } 
}; 
+0

Un modo molto interessante per raggiungere l'obiettivo :-) Sembra più promettente del mio stesso approccio :-) –

+0

anche il tuo era corretto (è stato distratto prima di avere l'opportunità di svitare :-) In tutti i contesti del mondo reale mi aspetterei _some_ mantenendo traccia di quale timer appartiene al quale optionPane – kleopatra

+0

stavo facendo coincidere il mio approccio con il tuo, poi ho scoperto, che ho dimenticato di spegnere il timer da nessuna parte: (e inoltre in questo approccio presentato, non c'è bisogno di convertire una cosa in un'altra, e tutto funziona in accordo :-) –