【发布时间】:2021-04-15 09:14:16
【问题描述】:
一般来说,在修复错误时,我不倾向于寻求帮助,但是,我有一个非常奇怪的问题,我花了 2 天时间试图修复它,但没有任何成功。我的课基本上是一个有多个难度的轮盘赌,所以我使用了一个饼图来改变难度并快速重绘轮盘,并使用饼图附带的很酷的动画,但是,让我的轮盘滚动到某个角度的方法有很大问题,在 RotateTransition 结束后,GUI 完全冻结。我不知道为什么,因为我在其他类中有其他 RotateTranstions,它们工作正常,而且,如果我删除 rotateTransition 或在其中使用其他组件(我尝试使用 pieChart 的图像)它工作得很好。我不知道 pieChart 是否有一些特殊之处使其无法与 RotateTransition 一起使用,唯一的冻结例外是允许我再次下注的按钮,是的,我已经尝试过“Platform.runLatter()”
@Override
public void initialize(URL url, ResourceBundle rb) {
rotateTransition = new RotateTransition();
rotateTransition.setNode(pieChart);
rotateTransition.setDuration(Duration.seconds(1));
rotateTransition.setByAngle(-360);
rotateTransition.setCycleCount(1);
rotateTransition.setAutoReverse(false);
pieChart.setData(dataForX1_5);
pieChart.setStartAngle(90);
applyDataWithCustomColor(dataForX1_5, "green", "red");
betButton.setOnAction(eh -> {
double betMultiplier=1.5;
if(rbX1_5==group.getSelectedToggle()){
pieChart.setData(dataForX1_5);
applyDataWithCustomColor(dataForX1_5, "green", "red");
betMultiplier=1.5;
}
if(rbX2==group.getSelectedToggle()){
pieChart.setData(dataForX2);
applyDataWithCustomColor(dataForX2, "green", "red");
betMultiplier=2;
}
if(rbX5==group.getSelectedToggle()){
pieChart.setData(dataForX5);
applyDataWithCustomColor(dataForX5, "green", "red");
betMultiplier=5;
}
if(rbX10==group.getSelectedToggle()){
pieChart.setData(dataForX10);
applyDataWithCustomColor(dataForX10, "green", "red");
betMultiplier=10;
}
if(rbX25==group.getSelectedToggle()){
pieChart.setData(dataForX25);
applyDataWithCustomColor(dataForX25, "green", "red");
betMultiplier=25;
}
if(rbX50==group.getSelectedToggle()){
pieChart.setData(dataForX50);
applyDataWithCustomColor(dataForX50, "green", "red");
betMultiplier=50;
}
try {
int betAmount = betAmountSpinner.getValue();
int spectedResult = (int) (betAmount * betMultiplier);
if (coins >= betAmount) {
dataOutputStream.writeUTF("PlaceBetOnUpgrade");
dataOutputStream.writeInt(betAmount);
dataOutputStream.writeInt(spectedResult);
if (dataInputStream.readBoolean()) {
int result = dataInputStream.readInt();
int payment = dataInputStream.readInt();
coins = coins - betAmount;
rotateTo(result, payment);
updateCoinsLabel();
}
}
} catch (IOException ex) {
ex.printStackTrace();
}
});
}
private void rotateTo(int result, int payment) {
rotateTransition.setToAngle(result * 3.60);
rotateTransition.setOnFinished(rotateEvent -> {
if (0 == payment) {
resultLabel.setText("Lost");
} else {
resultLabel.setText("Win");
coins = coins + payment;
updateCoinsLabel();
}
});
rotateTransition.play();
}
private void updateCoinsLabel() {
coinsLabel.setText(String.valueOf(coins));
}
【问题讨论】:
-
重现问题所必需的所有代码吗?你能把它浓缩成minimal reproducible example吗?
-
请阅读参考的帮助页面并采取相应措施
-
你真的希望 me(或任何其他潜在的帮助者)猜测完整控制器、fxml、应用程序和找到 your 代码中某处的错误(可能在我们猜测的代码中,也可能不在我们猜测的代码中)?这不会发生(不是来自我,也可能不是来自其他人)。顺便说一句:你知道像 100% 确定问题出在方法 这样的注释是逻辑废话,不是吗?仅当您确切地知道问题出在哪里时才是正确的,在这种情况下,询问是......没有实际意义;)
-
请在reproducible 发布一些内容,同时努力使示例最小化。
-
当您使代码更加集中时,您正朝着正确的方向前进。问题是您的示例(实际上是编辑前和编辑后)永远无法正确重现,因为我们不能只是复制它并执行它。问题出在你想的地方吗?是的。但这仅意味着您事后看来是正确的。当您在这里提出问题时,示例应该就像您正在提交错误报告一样。换句话说,它应该是minimal reproducible example。链接的帮助页面解释了它应该是什么样子。让我们更轻松地为您提供帮助只会为您带来好处。
标签: java user-interface animation javafx concurrency