当前位置: 首页 > 面试题库 >

从JFrame创建JFrame时出错

龙高歌
2023-03-14
问题内容

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

一旦提交被调用,将执行以下代码:

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

你知道为什么吗?


问题答案:

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

因此,此代码不应包含任何内容:

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


 类似资料:
  • GamedRiver: 我得到一个没有所有组件的空白JFrame(当我使用PlacementWindow的main初始化时,它被正确创建) PlacementWindow: 不幸的是,在调用Update时,该帧不会从原始MainMenu帧切换。有什么想法吗?

  • 我想帮助某人。我想创建一个当我单击按钮时会弹出的JGroup,它必须出现在单击按钮的地方,并且不得影响其他组件。这方面的一个例子是JDateChooser,当您单击该按钮时,一个日历就会出现在那里,但当您单击其他任何地方时,该面板就会消失。我想要的是在弹出时将名称列表放在该面板中。它类似于JPopup菜单,只是当您单击其他任何地方时它必须消失。

  • 很多人可能都知道,我是一个完全的Java新手。我已经尝试过对此进行研究(通过阅读StackOverflow上的其他帖子,在谷歌上搜索,并询问一位不太熟悉java的朋友),但我无法理解。答案可能很清楚也很简单,但我对此视而不见。我试图从不同的帧中处理JFrame。 我的应用程序应该按如下方式工作: 帧X有一个按钮,按下时:生成帧Y 帧Y有一个按钮,按下时:生成帧Z Frame Z有一个按钮,按下时:

  • 我对JAVA相当陌生,我有一个问题(我希望我的英语不是太差)。 以下是我的过程: 使用JButton(打开第二个JFrame)在主服务器中打开第一个JFrame。 单击时,使用ActionLister,我调用进程以打开第二个窗口,其背景为黑色(这非常有效)。 但是,如果我在setVisible()第二个JFrame之后添加一个长进程(在我的代码中,只有一个睡眠(5000)),那么这个进程将以白色显

  • 问题内容: 我不知道如何使用此代码: 使用x按钮关闭程序。 问题答案: 你需要线 因为按下X按钮时JFrame的默认行为等效于 因此,几乎所有时候,创建JFrame时都需要手动添加该行 我目前指的是like 中的常量,而不是像先前那样直接声明的常量更能反映意图。

  • 问题内容: 我试图在弹出新框架时禁用“主” 。我想要它,所以您不能在该框架上单击或拖动任何东西。我尝试将新框架设为a ,但这并没有禁用其他框架。我还查看了有关此的另一篇文章,建议将其设置为a,但仍然无法正常工作。我真的需要帮助。谢谢。这是我正在使用的代码,他们有什么问题吗? 代表“主”框架。 问题答案: 您已经设置了JDialog#setModal或JDialog#ModalityTypes,可能