JavaFX, проблема с Platform.runLater (), задержка рендеринга графики Canvas - PullRequest
0 голосов
/ 18 сентября 2018

Я пытаюсь сделать простую управляемую событиями игру TicTacToe, используя JavaFX.В настоящее время я борюсь с прекращением, когда определенные условия выполнены.Чтобы поместить это в более подробную информацию, игрок может нажать на элементы GridPane, которые являются Canvas объектами, и затем они заполнены формами "X" или "O" соответственно (я использую strokeLine и strokeOval методы GraphicsContext).Код ниже:

private static void placeX(Canvas square){
    GraphicsContext gc = square.getGraphicsContext2D();
    gc.setLineWidth(10.0f);
    gc.setStroke(Color.CORNFLOWERBLUE);
    gc.strokeLine(square.getWidth()*0.2, square.getHeight()*0.2, square.getWidth()*0.8, square.getHeight()*0.8);
    gc.strokeLine(square.getWidth()*0.8, square.getHeight()*0.2, square.getWidth()*0.2, square.getHeight()*0.8);
}

Как только 3 одинаковых фигуры появляются в линии или по диагонали, программа должна завершиться.Я делаю это, используя Platform.exit().Код ниже:

class HandleGame implements EventHandler<MouseEvent>{

    @Override
    public void handle(MouseEvent e){


        Canvas can = (Canvas)e.getTarget();
        //function to check if the canvas is clear 
             placeX(can);  

         if(game.isEnded()){  //checks if the same shape appears three times

            Platform.runLater(new Runnable() {
                @Override
                public void run(){
                    try {
                        Thread.sleep(5000);
                    }
                    catch(InterruptedException exc){
                        System.out.println("Got something: " + exc.getMessage());
                    }
                    Platform.exit();
                }
            });
        }
    } 
}

Этот обработчик событий присоединяется к каждому Canvas объекту в GridPane и срабатывает при отпускании мыши.Проблема, с которой я столкнулся, заключается в том, что после нажатия на последний Canvas, перед тем, как фигура появится на Canvas, указанный Runnable будет выполнен, и рендеринг будет неестественно задержан (фигура "X" появляется только на секунду раньшезакрытие).Достаточно странно, что 1 из 10 запусков выполняется должным образом.Как мне сделать триггер рендеринга до Thread.sleep() и после Platform.exit()?Почему в редких случаях рендеринг выполняется до Thread.sleep()?Я провел небольшое исследование, но не смог найти ничего решающего, я новичок, когда дело доходит до JavaFx.Ценю вашу помощь.

1 Ответ

0 голосов
/ 20 сентября 2018

На основе комментариев @Slaw и @VGR мне удалось решить проблему двумя разными методами, один из которых использовал PauseTransition, а второй Thread.Код ниже:

Использование PauseTransition:

if(game.isEnded()){
    PauseTransition termination = new PauseTransition(Duration.seconds(1d));
    termination.setOnFinished(event -> Platform.exit());
    termination.play();
}

Использование Thread:

if(game.isEnded()){

    new Thread(() -> {
        try{
            Thread.sleep(2000);
        }
        catch(InterruptedException exc){
            ; //exception handling code here
        }
        Platform.exit();       
    }).start();*/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...