gpt4 book ai didi

java - 从 JFrame 创建 JFrame 时出错

转载 作者:行者123 更新时间:2023-12-01 17:39:49 25 4
gpt4 key购买 nike

我有一个运行良好的应用程序,它的 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();

关于java - 从 JFrame 创建 JFrame 时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2435251/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com