2013-03-29 1 views
2

Si j'ai une méthode qui doit retourner quelque chose, et qu'elle doit afficher quelque chose sur l'interface utilisateur pour le faire (par exemple pour poser une question à l'utilisateur), j'utilise java.awt.EventQueue.invokeLater(new Runnable() {...}); pour l'exécuter sur le thread UI (Android fait quelque chose similaire en utilisant runOnUiThread()). Comment puis-je retourner quelque chose de ce Runnable? Par exemple:Comment puis-je retourner au mieux une valeur d'une classe anonyme dans une méthode?

public String askQuestion() 
{ 
    java.awt.EventQueue.invokeLater(new Runnable() { 
     @Override 
     public void run() { 
      String response = JOptionPane.showInputDialog(null, "What is 2+2?"); 
      //how do I return this response object to the method? 
     } 
    }); 
} 

Je ne peux pas utiliser une variable locale finale car la compilation ne me permettra pas de l'affecter. Je peux utiliser une variable de classe et y accéder en utilisant Class.this.<variable> mais est-ce le meilleur/seul moyen d'accomplir cela? Editer: J'ai besoin de renvoyer des choses autres que String aussi, c'était juste un exemple.

+0

Pouvez-vous utiliser 'java.util.concurrent.Future'? Ceux-ci sont généralement utilisés pour renvoyer quelque chose au thread principal. –

+1

Vous voulez dire 'FutureTask'? Je n'en ai jamais utilisé un auparavant, en lisant maintenant. – Logan

+0

@Heuster En fait, cela semble très utile en effet. J'espère que cela fonctionne aussi sur Android. – Logan

Répondre

3

Vous pouvez procéder comme suit:

public String askQuestion()throws Exception 
    { 
    final StringBuilder sBuilder = new StringBuilder(); 
    java.awt.EventQueue.invokeAndWait(new Runnable() { 
     @Override 
     public void run() { 
      String response = JOptionPane.showInputDialog(null, "What is 2+2?"); 
      sBuilder.append(response); 
     } 
    }); 
    return sBuilder.toString(); 
} 

Cela pourrait aussi être résolu comme suit:

String sResponse;//make sResponse a field of class xyz 
public String askQuestion()throws Exception 
{ 
    java.awt.EventQueue.invokeAndWait(new Runnable() { 
     @Override 
     public void run() { 
      String response = JOptionPane.showInputDialog(null, "What is 2+2?"); 
      sResponse = response; 
     } 
    }); 
    return sResopnse; 
} 
+4

Sauf qu'il retournera une chaîne vide (l'exécution ne sera pas encore exécutée au moment où vous atteignez l'instruction return). – assylias

+0

Oui, la méthode retournera avant la fin de l'opération d'interface utilisateur, ce qui signifie que 'sBuilder.toString()' sera appelé avant l'ajout de la réponse. Cela et cela ne m'aide pas si je dois retourner 'boolean' ou' int'. – Logan

+2

@assylias: yeah La méthode devrait utiliser 'invokeAndWait' en effet –

Questions connexes