繁体   English   中英

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

[英]Why is thread.sleep crashing my JavaFX app?

我有一个for循环遍历游戏中的所有玩家。 在下一次迭代之前,我想让当前玩家进行3分钟的选择(这是画布鼠标点击事件)。 我尝试的一切都没有错误地崩溃我的应用程序。 我已经在这几个小时了,不知道发生了什么。 我究竟做错了什么?

    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应用程序线程上睡觉。 这将冻结整个GUI,使其无法处理用户输入。 而是使用TimeLine

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

或javafx Task

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();

在这个例子中,睡眠发生在与FX应用程序线程不同的线程上。 一旦3分钟finishedSleeping()将在FX应用程序线程上调用finishedSleeping()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM