2010-03-12 7 views
0

J'ai une application qui fonctionne correctement et le JFrame est lancé dans le constructeur d'une classe GameInitializer qui accepte certains paramètres de configuration. J'ai essayé de créer une interface graphique dans laquelle l'utilisateur peut spécifier ces paramètres de configuration, puis cliquer sur soumettre. Lorsque l'utilisateur clique sur Envoyer, un nouvel objet GameInitializer est créé. L'erreur que je reçois est:Erreur lors de la création de JFrame à partir de JFrame

Exception in thread "AWT-EventQueue-0" java.lang.Error: Cannot call invokeAndWait from the event dispatcher thread 
    at java.awt.EventQueue.invokeAndWait(Unknown Source) 
    at javax.swing.SwingUtilities.invokeAndWait(Unknown Source) 
    at game.player.humanplayer.view.HumanView.update(HumanView.java:43) 

une fois soumettons est appelé ce code est exécuté:

values assigned to parames... 
    new GameInitializer(userName, player, Constants.BLIND_STRUCTURE_FILES.get(blindStructure), handState); 

ensuite le code dans le constructeur GameInitializer est:

public GameInitializer(String playerName, AbstractPlayer opponent, String blindStructureConfig, AbstractHandState handState){ 
     beginGame(playerName, opponent, blindStructureConfig, handState); 
    } 

    public static void beginGame(String playerName, AbstractPlayer opponent, String blindStructureConfig, AbstractHandState handState){ 
     AbstractDealer dealer; 
     BlindStructure.initialize(blindStructureConfig); 
     AbstractPlayer humanPlayer = new HumanPlayer(playerName, handState); 

     AbstractPlayer[] players = new AbstractPlayer[2]; 
     players[0] = humanPlayer; 
     players[1] = opponent; 

     handState.setTableLayout(players); 

     for(AbstractPlayer player : players){ 
      player.initialize(); 
     } 

     dealer = new Dealer(players, handState); 

     dealer.beginGame(); 
    } 

Il essentiellement cascades vers le bas et appelle finalement ce morceau de code dans la classe HumanView:

public void update(final Event event, final ReadableHandState handState, final AbstractPlayer player) { 
     try { 
      SwingUtilities.invokeAndWait(new Runnable() { 

       public void run() { 
        gamePanel.update(event, handState, player); 
        validate(); 
       } 
      }); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } catch (InvocationTargetException e) { 
      e.printStackTrace(); 
     } 

     if(event.equals(Event.HAND_ENDING)){ 
      try { 
       if(handState.wonByShowdown() || handState.isSplitPot()){ 
        Thread.sleep(3500); 
       } 
       else{ 
        Thread.sleep(1000); 
       } 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 

Avez-vous une idée pourquoi?

+0

Postez votre code s'il vous plaît! (Et par "votre code" je veux dire "HumanView.update", pas "tout votre code".) –

+0

ont mis à jour la question avec du code :) – Aly

Répondre

3

Le point invokeAndWait() permet à un autre thread d'attendre que quelque chose soit fait dans le thread d'envoi d'événement (EDT). Comme ce code s'exécute déjà sur l'EDT, il suffit de l'appeler directement plutôt que de créer un Runnable.

Donc, ce code ne doit pas être entouré par quoi que ce soit:

gamePanel.update(event, handState, player); 
validate(); 
2

On dirait que vous êtes déjà dans le fil Swing, de sorte que vous vous posez le fil Swing attendre pendant que vous faites le code dans Swing fil. Cela ne marchera pas. Vous devez supprimer le code entourant

   gamePanel.update(event, handState, player); 
       validate(); 
+1

Bonne idée; J'aurais aimé y penser. : P –

+0

J'étais en train d'écrire la réponse quand j'ai posté et vu la tienne :) –