首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从JFrame创建JFrame时出错

从JFrame创建JFrame时出错
EN

Stack Overflow用户
提问于 2010-03-13 03:28:20
回答 2查看 443关注 0票数 0

我有一个运行良好的应用程序,它的JFrame是在GameInitializer类的构造函数中启动的,该类接受一些配置参数。我尝试创建一个GUI,允许用户指定这些配置参数,然后单击submit。当用户单击submit时,将创建一个新的GameInitializer对象。我得到的错误是:

代码语言:javascript
复制
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,就会执行以下代码:

代码语言:javascript
复制
values assigned to parames...   
    new GameInitializer(userName, player, Constants.BLIND_STRUCTURE_FILES.get(blindStructure), handState);

那么GameInitializer构造函数中的代码是:

代码语言:javascript
复制
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类中的这段代码:

代码语言:javascript
复制
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();
            }
        }
    }

你知道为什么吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-03-13 03:37:45

invokeAndWait()的作用是让另一个线程在事件分派线程中等待要做的事情。由于此代码已经在EDT上执行,因此直接调用它就足够了,而不是创建一个Runnable。

所以这段代码不应该被任何东西包围:

代码语言:javascript
复制
gamePanel.update(event, handState, player); 
validate(); 
票数 3
EN

Stack Overflow用户

发布于 2010-03-13 03:43:05

看起来您已经在Swing线程中了,所以当您在Swing线程中编写代码时,您要求Swing线程等待。这行不通的。您需要删除周围的代码

代码语言:javascript
复制
                gamePanel.update(event, handState, player);
                validate();
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2435251

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档