Java 从JFrame创建JFrame时出错
我有一个运行良好的应用程序,它的JFrame是在GameInitializer类的构造函数中启动的,该类接受一些配置参数。我尝试创建一个GUI,允许用户指定这些配置参数,然后单击submit。当用户单击submit时,将创建一个新的GameInitializer对象。我得到的错误是:Java 从JFrame创建JFrame时出错,java,swing,events,awt,Java,Swing,Events,Awt,我有一个运行良好的应用程序,它的JFrame是在GameInitializer类的构造函数中启动的,该类接受一些配置参数。我尝试创建一个GUI,允许用户指定这些配置参数,然后单击submit。当用户单击submit时,将创建一个新的GameInitializer对象。我得到的错误是: Exception in thread "AWT-EventQueue-0" java.lang.Error: Cannot call invokeAndWait from the event dispatcher
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();
}
}
}
你知道为什么吗?调用EANDWAIT()的要点是让另一个线程等待在事件调度线程(EDT)中执行某些操作。由于此代码已经在EDT上执行,因此直接调用它就足够了,而不是创建可运行的 因此,此代码不应被任何内容包围:
gamePanel.update(event, handState, player);
validate();
invokeAndWait()
的要点是让另一个线程等待在事件调度线程(EDT)中执行某些操作。由于此代码已经在EDT上执行,因此直接调用它就足够了,而不是创建可运行的
因此,此代码不应被任何内容包围:
gamePanel.update(event, handState, player);
validate();
看起来您已经在Swing线程中了,所以您要求Swing线程等待您在Swing线程中编写代码。这行不通。您需要删除周围的代码
gamePanel.update(event, handState, player);
validate();
看起来您已经在Swing线程中了,所以您要求Swing线程等待您在Swing线程中编写代码。这行不通。您需要删除周围的代码
gamePanel.update(event, handState, player);
validate();
请张贴您的密码!(我所说的“你的代码”是指“HumanView.update”,而不是“所有代码”。)用一些代码更新了问题:)请发布你的代码!(我说的“你的代码”是指“HumanView.update”,而不是“所有的代码”。)用一些代码更新了问题:)好主意;我希望我能想到那一点当我张贴并看到你的答案时,PI实际上是在写答案的中间:“好主意;我希望我能想到那一点当我张贴并看到你的答案时,PI实际上是在写答案的中间。