2013-10-10 2 views
0

Comme indiqué sur mon titre, mon showConfirmDialog n'attend jamais le bouton "Oui" ou "Non" lorsque j'appelle.JOptionPane.showConfirmDialog n'arrête pas le thread en cours

A l'origine, j'ai rencontré un bug qui m'a demandé d'obtenir JOptionPanes, donc maintenant j'utilise la méthode invokeLater. Je ne connais pas trop le concept et je m'excuse d'avance.

public int firstGame() 
{ 

    SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      yOrN = JOptionPane.showConfirmDialog(null, 
        "Are you ready to play?\n", "Play?", JOptionPane.YES_NO_OPTION); 
     } 
    }); 
    return yOrN; 
    // will return 0 if yes and 1 if no. 

} 

Avant d'utiliser invokeLater, il fonctionnait très bien (sauf pour les JOptionPane vierges s). Est-ce que cette méthode exécute un autre thread? Howcome mon showInputDialog attend une entrée et pas celui-ci?

+0

ne comprennent pas, son propos de la norme, exigence d'envelopper JOptionPane dans invokeLater, – mKorbel

Répondre

2

SwingUtilities.invokeLater exactement ce que fait, il place le Runnable sur la file d'attente d'événement à exécuter plus tard, ce qui signifie qu'une fois que vous l'avez appelé, votre déclaration return est exécutée presque immédiatement après et un peu de temps à l'avenir, le JOptionPane sera affiché .

Les demandes de ce type sont placés sur la file d'attente d'événements et sont processus par l'événement Dispatching Discussion

Jetez un oeil à How to pass results from EDT back to a different thread? une solution possible ...

+0

Merci pour l'explication soignée! Et merde la solution est loin de la portée de ce que j'ai appris jusqu'à présent. Je vais y jeter un coup d'oeil. Merci encore! – kir

+0

Je fais cela depuis 14 ans et 'Future' me fait encore peur: P ... solution soignée bien – MadProgrammer

+0

@MadProgrammer +1 pour isEventDispatch ..., en revanche parler de squelette et ses notifiants sont mal conçus, non idée comment créer un exemple de code causé par des OP ... – mKorbel

Questions connexes