Ошибка при создании JFrame из JFrame - PullRequest
0 голосов
/ 12 марта 2010

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

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)

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

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

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

Ответы [ 2 ]

3 голосов
/ 12 марта 2010

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

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

gamePanel.update(event, handState, player); 
validate(); 
2 голосов
/ 12 марта 2010

Похоже, вы уже в потоке Swing, поэтому вы просите нить Swing подождать, пока вы создадите код в потоке Swing. Это не сработает. Вам необходимо удалить код, окружающий

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