Модификация интерфейса с ключевыми взаимодействиями в javafx - PullRequest
0 голосов
/ 03 января 2019

Я пытаюсь кодировать игру 2048 с использованием JavaFX, и у меня возникла проблема.

@Override
public void start(Stage primaryStage){
    primaryStage.setResizable(false);
    Scene scene = new Scene(firstContent());
    primaryStage.setScene(scene);
    primaryStage.show();
    scene.setOnKeyPressed(new EventHandler<KeyEvent>(){
        @Override
        public void handle(KeyEvent e){
            KeyCode key = e.getCode();
            if((key.equals(KeyCode.UP))){
                System.out.println("recieved UP");
                Scene scene = new Scene(createContent());
                primaryStage.setScene(scene);
                primaryStage.show();
            } else if(key.equals(KeyCode.DOWN)){
                System.out.println("recieved DOWN");
            }
        }
    }); 
}

Итак, я открываю свое окно, инициализированное firstContent (в основном оно создает массив пустых плиток и заполняет два из них 2 или 4 случайным образом), отображаю его и начинаю прослушивать нажатия клавиш. Идея состоит в том, чтобы иметь поведение для каждой клавиши со стрелкой (ВВЕРХ ВНИЗ ВЛЕВО ВПРАВО), которая будет соответственно перемещать плитки. Это делается с помощью следующего метода createContent ():

    public Parent createContent(){
    String c  = "";
    List<Integer> known = new ArrayList<Integer>();
    Pane root = new Pane();
    root.setPrefSize(740, 700);
    Random rand = new Random();
    int pos1 = rand.nextInt(15);
    if(tiles.get(pos1) != new Tile("")){
        known.add(pos1);
        pos1 = rand.nextInt(15);
        if(known.contains(pos1)){
            known.add(pos1);
            pos1 = rand.nextInt(15);
        }
    }
    for(int i = 0; i < NB_TILES; i++){
        tiles.add(new Tile(c));
    }
    tiles.set(pos1, new Tile("2048"));

    for(int i = 0; i < tiles.size(); i++){
        // boring stuff to set the tile display to the right size
    }
    return root;
}

Теперь о проблеме: при запуске приложения, если я нажимаю стрелку вниз, я получаю на своем терминале текст «получен ВНИЗ» столько раз, сколько нажимаю клавишу, как и ожидалось. Но если я нажму стрелку вверх, приложение получит его только один раз, и приложение будет заморожено (то есть, если я нажму снова, ничего не произойдет). Как вы могли догадаться, я хочу иметь возможность вызывать свой метод для каждого нажатия клавиши, чтобы иметь возможность перемещать свои плитки и полностью комбинировать их, чтобы получить играбельную версию 2048 ... Кто-нибудь знает, почему мое приложение зависает?

При необходимости я могу предоставить другие фрагменты кода, но я думаю, что предоставил основные. Просто знайте, что firstContent () сейчас работает в основном так же, как createContent, за исключением того, что он генерирует два случайных числа, чтобы получить первые плитки игры.

Заранее спасибо за помощь.

...