2010-03-12 4 views
0

У меня есть приложение, которое отлично работает, а JFrame для него запускается в конструкторе класса GameInitializer, который принимает некоторые параметры конфигурации. Я попытался создать графический интерфейс, в котором пользователь может указать эти параметры конфигурации и нажать кнопку «Отправить». Когда пользователь нажимает кнопку отправки нового объекта GameInitializer. Ошибка я получаю:Ошибка при создании JFrame из 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) 

раз представить называется этот код выполняется:

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

Тогда код в конструкторе GameInitializer является:

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(); 
    } 

Это в основном каскадами вниз и в конечном итоге называет этот фрагмент кода в классе 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(); 
      } 
     } 
    } 

У вас есть идеи, почему?

+0

Сообщите ваш код пожалуйста! (И под «вашим кодом» я имею в виду «HumanView.update», а не «весь ваш код».) –

+0

обновили вопрос с помощью некоторого кода :) – Aly

ответ

3

Точка invokeAndWait() предназначена для другого потока, чтобы ждать чего-то, что нужно сделать в случае отправки потока (EDT). Поскольку этот код уже выполняется на EDT, его достаточно назвать напрямую, а не создавать Runnable.

Так что этот код не должен быть окружен чем:

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

Похоже, вы уже в свинг потоке, поэтому вы спрашиваете Свинг нить ждать, пока вы делаете код в Качели нить. Это не сработает. Вам необходимо удалить код, указанный во всем мире

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

Хорошая идея; Хотел бы я подумать об этом. : P –

+0

Я был на самом деле в середине написания ответа, когда я писал и видел ваши :) –

Смежные вопросы