gpt4 book ai didi

java - 为什么 thread.sleep 会使我的 JavaFX 应用程序崩溃?

转载 作者:太空宇宙 更新时间:2023-11-04 11:49:35 25 4
gpt4 key购买 nike

我有一个 for 循环,它会遍历游戏中的所有玩家。在下一次迭代之前,我想给当前玩家 3 分钟的时间来进行选择(即 Canvas 鼠标单击事件)。我尝试过的所有操作都会使我的应用程序崩溃而没有错误。我已经在这里呆了几个小时了,不知道发生了什么。我做错了什么?

    startGame.addEventHandler(MouseEvent.MOUSE_CLICKED,
new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent e) {

gameStatus = "Started";
players.add(new Player(0, "Amrit"));
players.add(new Player(1, "Tyler"));
players.add(new Player(2, "Scott"));
players.add(new Player(3, "Ryker"));

//Select first two settlements with one road extending from each
for (int s = 0; s < 2; s++) {

for (int p = 0; p < players.size(); p++) {

phase = "Pick Settlements";
playerTurn = p;

//Loop through all tiles
for (int t = 0; t < tiles.length; t++) {

//Loop through the vertices of the current tile
for (int v = 0; v < tiles[t].vertices.length; v++) {

drawCircle(gc, new Point(tiles[t].vertices[v].x, tiles[t].vertices[v].y), (int) (windowHeight * .05), true, true, "rgba(255, 238, 144, .3)", 0);

}

}

gc.setFill(Color.web("0xFFEB8A"));
gc.strokeText(players.get(p).name + ", please place your first settlement!", windowHeight * .95, windowWidth * .85);
selected = false;
canvas.addEventFilter(MouseEvent.MOUSE_CLICKED, new EventHandler<MouseEvent>() {
// @Override
@Override
public void handle(final MouseEvent event) {
if (!pointClicked().equals(0)) {
players.get(playerTurn).settlementsAvail--;
selected = true;
}
}

});

try
{
Thread.sleep(1000 * 60 * 3);
}
catch(InterruptedException er)
{
// this part is executed when an exception (in this example InterruptedException) occurs
}
}

}

gameStatus = "Ended";

}

});

最佳答案

您正在 FX 应用程序线程上 hibernate 。这将卡住您的整个 GUI,使其无法处理用户输入。而是使用 TimeLine:

Timeline timer = new Timeline(            
new KeyFrame(Duration.seconds(60 * 3), event -> finishedSleeping())
);
timer.play();

或 javafx 任务:

Task<Void> timer = new Task<Void>() {
@Override
protected Void call() throws Exception {
try {
Thread.sleep(1000 * 60 * 3);
} catch (InterruptedException e) {}
return null;
}
};
timer.setOnSucceeded(event -> finishedSleeping());
new Thread(timer).start();

在此示例中, sleep 发生在与 FX 应用程序线程不同的线程上。 3 分钟结束后,finishedSleeping() 将在 FX 应用程序线程上调用。

关于java - 为什么 thread.sleep 会使我的 JavaFX 应用程序崩溃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41986345/

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