代码之家  ›  专栏  ›  技术社区  ›  Aly

从JFrame创建JFrame时出错

  •  0
  • Aly  · 技术社区  · 16 年前

    我有一个运行良好的应用程序,它的JFrame是在GameInitializer类的构造函数中启动的,该类接受一些配置参数。我尝试创建一个GUI,允许用户指定这些配置参数,然后单击submit。当用户单击submit时,会创建一个新的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);
    

    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 回复  |  直到 16 年前
        1
  •  3
  •   Michael Myers KitsuneYMG    16 年前

    重点 invokeAndWait() 是另一个线程等待在事件调度线程(EDT)中执行某些操作。因为这个代码已经在EDT上执行了,所以直接调用它就足够了,而不是创建一个Runnable。

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

    gamePanel.update(event, handState, player); 
    validate(); 
    
        2
  •  2
  •   Chris Dennett    16 年前

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

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