我不会张贴所有的代码,只是与之相关的部分。我真的不太熟悉创建自己的侦听器,这本书还没有涉及到这一点。也许我做错了,但你可以查看下面的代码,自己看看。基本上,当我改变值时,它会一遍又一遍地尝试设置值或其他东西,我试图用断点跟踪它,看看是否能捕捉到问题,但可能我错过了something...Tracing问题。问题停在设置BooleanProperty值的特定代码行,并在每次我将其向前移动一行时停留在那里。
下面是我的对象构造函数和数据字段
private BooleanProperty endTurn;
/** Constructor */
public PlayerHand() {
// Set the Data Field values
super.playerCards = new ArrayList<>();
this.chips = 100;
this.lastBet = 0;
this.endTurn = new SimpleBooleanProperty(this, "endTurn", false);
}下面是getter、setter和property方法
/** Get whether the player has ended the turn */
public boolean getEndTurn() {
return this.endTurn.get();
}
/** Set's the end of turn */
public void setEndTurn(boolean endTurn) {
this.endTurn.setValue(endTurn);
}
/** Property getter method for ending the turn */
public BooleanProperty endTurnProperty() {
return this.endTurn;
}下面是创建该对象的类中的侦听器
// Set the binds for each player
for (int i = 0; i < players - 1; i++) {
alPlayerHand.get(i).endTurnProperty().addListener(e -> {
progressTurn();
});
}编辑:我忘了添加这一行,这是跟踪卡住的地方
public void progressTurn() {
// Have AI make their decisions and turn rules on and off
if (alPlayerHand.get(playersTurn).getLastBet() == 0) {
if (alPlayerHand.get(playersTurn).isLittleBlind() &&
currentGameRound == 1) {
alPlayerHand.get(playersTurn).setBet(littleBlind);
lastPlayer = "Little Blind";
} else if (alPlayerHand.get(playersTurn).isBigBlind() &&
currentGameRound == 1) {
alPlayerHand.get(playersTurn).setBet(bigBlind);
lastPlayer = "Big Blind";
} else if (alPlayerHand.get(playersTurn).isAI()) {
alPlayerHand.get(playersTurn).decide();
lastPlayer = alPlayerHand.get(playersTurn).getLastMove();
}
}
// Add the last bet to the pot
pot += alPlayerHand.get(playersTurn).getLastBet();
alPlayerHand.get(playersTurn).setBet(0);
if ((playersTurn + 1) <= players - 1 &&
alPlayerHand.get(playersTurn).isAI()) {
playersTurn++;
} else if ((playersTurn + 1) > players - 1 &&
alPlayerHand.get(playersTurn).isAI())
playersTurn = 0;
endTurn(); // Debug stops here and stays here
}编辑:再次忘记代码
/** End the current players turn */
public void endTurn() {
// End Players turn
if (alPlayerHand.get(playersTurn).getEndTurn()) {
alPlayerHand.get(playersTurn).setEndTurn(false);
} else
alPlayerHand.get(playersTurn).setEndTurn(true);
}最后是错误-大多数已经被删除,因为它只是重复自己
Exception in thread "JavaFX Application Thread" java.lang.StackOverflowError
at javafx.beans.property.BooleanPropertyBase.markInvalid(BooleanPropertyBase.java:109)
at javafx.beans.property.BooleanPropertyBase.set(BooleanPropertyBase.java:143)
at javafx.beans.property.BooleanProperty.setValue(BooleanProperty.java:77)
at Casino_Poker.PlayerHand.setEndTurn(PlayerHand.java:188)
at Casino_Poker.Main.endTurn(Main.java:1043)
at Casino_Poker.Main.progressTurn(Main.java:1014)
at Casino_Poker.Main.lambda$TexasHoldEm$16(Main.java:972)
at Casino_Poker.Main$$Lambda$13/477174400.invalidated(Unknown Source)
at com.sun.javafx.binding.ExpressionHelper$SingleInvalidation.fireValueChangedEvent(ExpressionHelper.java:135)
at com.sun.javafx.binding.ExpressionHelper.fireValueChangedEvent(ExpressionHelper.java:80)
at javafx.beans.property.BooleanPropertyBase.fireValueChangedEvent(BooleanPropertyBase.java:103)
at javafx.beans.property.BooleanPropertyBase.markInvalid(BooleanPropertyBase.java:110)
at javafx.beans.property.BooleanPropertyBase.set(BooleanPropertyBase.java:143)
at javafx.beans.property.BooleanProperty.setValue(BooleanProperty.java:77)
at Casino_Poker.PlayerHand.setEndTurn(PlayerHand.java:188)
at Casino_Poker.Main.endTurn(Main.java:1041)
at Casino_Poker.Main.progressTurn(Main.java:1014)
at Casino_Poker.Main.lambda$TexasHoldEm$16(Main.java:972)
at Casino_Poker.Main$$Lambda$13/477174400.invalidated(Unknown Source)
at com.sun.javafx.binding.ExpressionHelper$SingleInvalidation.fireValueChangedEvent(ExpressionHelper.java:135)
at com.sun.javafx.binding.ExpressionHelper.fireValueChangedEvent(ExpressionHelper.java:80)
at javafx.beans.property.BooleanPropertyBase.fireValueChangedEvent(BooleanPropertyBase.java:103)
at javafx.beans.property.BooleanPropertyBase.markInvalid(BooleanPropertyBase.java:110)
at javafx.beans.property.BooleanPropertyBase.set(BooleanPropertyBase.java:143)
at javafx.beans.property.BooleanProperty.setValue(BooleanProperty.java:77)
at Casino_Poker.PlayerHand.setEndTurn(PlayerHand.java:188)
at Casino_Poker.Main.endTurn(Main.java:1043)
at Casino_Poker.Main.progressTurn(Main.java:1014)
at Casino_Poker.Main.lambda$TexasHoldEm$16(Main.java:972)
at Casino_Poker.Main$$Lambda$13/477174400.invalidated(Unknown Source)
at com.sun.javafx.binding.ExpressionHelper$SingleInvalidation.fireValueChangedEvent(ExpressionHelper.java:135)
at com.sun.javafx.binding.ExpressionHelper.fireValueChangedEvent(ExpressionHelper.java:80)
at javafx.beans.property.BooleanPropertyBase.fireValueChangedEvent(BooleanPropertyBase.java:103)
at javafx.beans.property.BooleanPropertyBase.markInvalid(BooleanPropertyBase.java:110)
at javafx.beans.property.BooleanPropertyBase.set(BooleanPropertyBase.java:143)
at javafx.beans.property.BooleanProperty.setValue(BooleanProperty.java:77)
at Casino_Poker.PlayerHand.setEndTurn(PlayerHand.java:188)
at Casino_Poker.Main.endTurn(Main.java:1043)
at Casino_Poker.Main.progressTurn(Main.java:1014)
at Casino_Poker.Main.lambda$TexasHoldEm$16(Main.java:972)
at Casino_Poker.Main$$Lambda$13/477174400.invalidated(Unknown Source)
at com.sun.javafx.binding.ExpressionHelper$SingleInvalidation.fireValueChangedEvent(ExpressionHelper.java:135)
at com.sun.javafx.binding.ExpressionHelper.fireValueChangedEvent(ExpressionHelper.java:80)
at javafx.beans.property.BooleanPropertyBase.fireValueChangedEvent(BooleanPropertyBase.java:103)
at javafx.beans.property.BooleanPropertyBase.markInvalid(BooleanPropertyBase.java:110)
at javafx.beans.property.BooleanPropertyBase.set(BooleanPropertyBase.java:143)
at javafx.beans.property.BooleanProperty.setValue(BooleanProperty.java:77)
at Casino_Poker.PlayerHand.setEndTurn(PlayerHand.java:188)
at Casino_Poker.Main.endTurn(Main.java:1041)
at Casino_Poker.Main.progressTurn(Main.java:1014)
at Casino_Poker.Main.lambda$TexasHoldEm$16(Main.java:972)
at Casino_Poker.Main$$Lambda$13/477174400.invalidated(Unknown Source)
at com.sun.javafx.binding.ExpressionHelper$SingleInvalidation.fireValueChangedEvent(ExpressionHelper.java:135)
at com.sun.javafx.binding.ExpressionHelper.fireValueChangedEvent(ExpressionHelper.java:80)
at javafx.beans.property.BooleanPropertyBase.fireValueChangedEvent(BooleanPropertyBase.java:103)
at javafx.beans.property.BooleanPropertyBase.markInvalid(BooleanPropertyBase.java:110)
at javafx.beans.property.BooleanPropertyBase.set(BooleanPropertyBase.java:143)
at javafx.beans.property.BooleanProperty.setValue(BooleanProperty.java:77)
at Casino_Poker.PlayerHand.setEndTurn(PlayerHand.java:188)
at Casino_Poker.Main.endTurn(Main.java:1043)
at Casino_Poker.Main.progressTurn(Main.java:1014)
at Casino_Poker.Main.lambda$TexasHoldEm$16(Main.java:972)
at Casino_Poker.Main$$Lambda$13/477174400.invalidated(Unknown Source)
at com.sun.javafx.binding.ExpressionHelper$SingleInvalidation.fireValueChangedEvent(ExpressionHelper.java:135)
at com.sun.javafx.binding.ExpressionHelper.fireValueChangedEvent(ExpressionHelper.java:80)
at javafx.beans.property.BooleanPropertyBase.fireValueChangedEvent(BooleanPropertyBase.java:103)
at javafx.beans.property.BooleanPropertyBase.markInvalid(BooleanPropertyBase.java:110)
at javafx.beans.property.BooleanPropertyBase.set(BooleanPropertyBase.java:143)
at javafx.beans.property.BooleanProperty.setValue(BooleanProperty.java:77)
at Casino_Poker.PlayerHand.setEndTurn(PlayerHand.java:188)
at Casino_Poker.Main.endTurn(Main.java:1041)
at Casino_Poker.Main.progressTurn(Main.java:1014)
at Casino_Poker.Main.lambda$TexasHoldEm$16(Main.java:972)
at Casino_Poker.Main$$Lambda$13/477174400.invalidated(Unknown Source)
at com.sun.javafx.binding.ExpressionHelper$SingleInvalidation.fireValueChangedEvent(ExpressionHelper.java:135)
at com.sun.javafx.binding.ExpressionHelper.fireValueChangedEvent(ExpressionHelper.java:80)
at javafx.beans.property.BooleanPropertyBase.fireValueChangedEvent(BooleanPropertyBase.java:103)
at javafx.beans.property.BooleanPropertyBase.markInvalid(BooleanPropertyBase.java:110)
at javafx.beans.property.BooleanPropertyBase.set(BooleanPropertyBase.java:143)
at javafx.beans.property.BooleanProperty.setValue(BooleanProperty.java:77)
at Casino_Poker.PlayerHand.setEndTurn(PlayerHand.java:188)
at Casino_Poker.Main.endTurn(Main.java:1043)
at Casino_Poker.Main.progressTurn(Main.java:1014)
at Casino_Poker.Main.lambda$TexasHoldEm$16(Main.java:972)
at Casino_Poker.Main$$Lambda$13/477174400.invalidated(Unknown Source)
at com.sun.javafx.binding.ExpressionHelper$SingleInvalidation.fireValueChangedEvent(ExpressionHelper.java:135)
at com.sun.javafx.binding.ExpressionHelper.fireValueChangedEvent(ExpressionHelper.java:80)
at javafx.beans.property.BooleanPropertyBase.fireValueChangedEvent(BooleanPropertyBase.java:103)
at javafx.beans.property.BooleanPropertyBase.markInvalid(BooleanPropertyBase.java:110)
at javafx.beans.property.BooleanPropertyBase.set(BooleanPropertyBase.java:143)
at javafx.beans.property.BooleanProperty.setValue(BooleanProperty.java:77)
at Casino_Poker.PlayerHand.setEndTurn(PlayerHand.java:188)
at Casino_Poker.Main.endTurn(Main.java:1041)
at Casino_Poker.Main.progressTurn(Main.java:1014)
at Casino_Poker.Main.lambda$TexasHoldEm$16(Main.java:972)
at Casino_Poker.Main$$Lambda$13/477174400.invalidated(Unknown Source)
at com.sun.javafx.binding.ExpressionHelper$SingleInvalidation.fireValueChangedEvent(ExpressionHelper.java:135)
at com.sun.javafx.binding.ExpressionHelper.fireValueChangedEvent(ExpressionHelper.java:80)
at javafx.beans.property.BooleanPropertyBase.fireValueChangedEvent(BooleanPropertyBase.java:103)
at javafx.beans.property.BooleanPropertyBase.markInvalid(BooleanPropertyBase.java:110)
at javafx.beans.property.BooleanPropertyBase.set(BooleanPropertyBase.java:143)
at javafx.beans.property.BooleanProperty.setValue(BooleanProperty.java:77)
at Casino_Poker.PlayerHand.setEndTurn(PlayerHand.java:188)
at Casino_Poker.Main.endTurn(Main.java:1043)
at Casino_Poker.Main.progressTurn(Main.java:1014)
at Casino_Poker.Main.lambda$TexasHoldEm$16(Main.java:972)
at Casino_Poker.Main$$Lambda$13/477174400.invalidated(Unknown Source)
at com.sun.javafx.binding.ExpressionHelper$SingleInvalidation.fireValueChangedEvent(ExpressionHelper.java:135)
at com.sun.javafx.binding.ExpressionHelper.fireValueChangedEvent(ExpressionHelper.java:80)
at javafx.beans.property.BooleanPropertyBase.fireValueChangedEvent(BooleanPropertyBase.java:103)
at javafx.beans.property.BooleanPropertyBase.markInvalid(BooleanPropertyBase.java:110)
at javafx.beans.property.BooleanPropertyBase.set(BooleanPropertyBase.java:143)
at javafx.beans.property.BooleanProperty.setValue(BooleanProperty.java:77)
at Casino_Poker.PlayerHand.setEndTurn(PlayerHand.java:188)
at Casino_Poker.Main.endTurn(Main.java:1043)
at Casino_Poker.Main.progressTurn(Main.java:1014)
at Casino_Poker.Main.lambda$TexasHoldEm$16(Main.java:972)
at Casino_Poker.Main$$Lambda$13/477174400.invalidated(Unknown Source)
at com.sun.javafx.binding.ExpressionHelper$SingleInvalidation.fireValueChangedEvent(ExpressionHelper.java:135)
at com.sun.javafx.binding.ExpressionHelper.fireValueChangedEvent(ExpressionHelper.java:80)
at javafx.beans.property.BooleanPropertyBase.fireValueChangedEvent(BooleanPropertyBase.java:103)
at javafx.beans.property.BooleanPropertyBase.markInvalid(BooleanPropertyBase.java:110)我真的很感激任何关于我做错了什么的建议,这本书只介绍了绑定属性的创建,所以far...but从来没有介绍过内部的工作原理,只有方法是如何设置的,其中的语句是看不见的。
基本上,我希望玩家进行他们的移动,如果玩家是AI控制的,那么计算机做出决定,并在结束时设置endTurn值,然后导致侦听器调用progressTurn方法,循环继续
发布于 2014-08-23 10:55:44
当我在endTurn()方法的if语句中调用布尔属性的getter时,我假设它触发了我的侦听器,所以我所做的就是用'if (playersTurn %2 == 0)‘替换它
https://stackoverflow.com/questions/25453977
复制相似问题