KeyEvent для изменения фотографий не работает, как его активировать? - PullRequest
0 голосов
/ 30 мая 2019

Я хочу сделать переключение фото-программы, используя imageView и keyEvent, но когда я пытаюсь использовать keyEvent, оно не работает, я пытался добавить scene.getRoot (). RequestFocus (); но не помогло, поэтому мой вопрос: почему это не работает, как я мог активировать его?

MenuScreenController.java

    @FXML
public void getNewImageHandler(KeyEvent event) {
    System.out.println(singleFile.getName());
    imgFieldView.setOnKeyPressed(e -> {
        if (e.getCode() == KeyCode.N) {
            photoSwipCounter++;
            System.out.println("P clicked");
        } else if (e.getCode() == KeyCode.P) {
            photoSwipCounter--;
        }
    });

//        if (event.getCode().equals(KeyCode.N)) {
//            photoSwipCounter++;
//        }
//        if (event.getCode().equals(KeyCode.P)) {
//            photoSwipCounter--;
//        }

    if (photoSwipCounter < 0) {
        singleFile = selectedImgsList.get(selectedImgsList.size() - photoSwipCounter);
    } else {
        singleFile = selectedImgsList.get(photoSwipCounter);
    }

    image = new Image(singleFile.toURI().toString(),
            900, 400,
            true, true, true);
    imgFieldView.setImage(image);
}

Как вы можете видеть, я пробовал много методов, потоковых или классических, но это не изменило.

MenuScreen.fxml

<Pane fx:id="menuPane" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="700.0" prefWidth="1000.0" xmlns="http://javafx.com/javafx/8.0.171" xmlns:fx="http://javafx.com/fxml/1" fx:controller="screensaverfxml.Controllers.MenuScreenController">
   <children>
      <ImageView fx:id="imgFieldView" fitHeight="400.0" fitWidth="900.0" layoutX="66.0" layoutY="62.0" onKeyPressed="#getNewImageHandler" onMouseClicked="#imgDoubleClick" pickOnBounds="true" preserveRatio="true" />
   </children>
</Pane>

ScreenSaverFXML.java

    @Override
public void start(Stage primaryStage) throws Exception {
    FXMLLoader loader = new FXMLLoader(this.getClass().getResource("/screensaverfxml/fxmlConfig/MainScreen.fxml"));
    Pane mainPane = loader.load();
    Scene scene = new Scene(mainPane, 1000, 700);
    primaryStage.setScene(scene);
    primaryStage.setTitle("Screen Saver");

    primaryStage.show();

   scene.getRoot().requestFocus();
}

И, конечно, у меня есть способ загрузить первую фотографию в imageView, и она работает, загружая ее из папки в список, но переключаясь на следующую нет

1 Ответ

3 голосов
/ 30 мая 2019

Только узлы, имеющие фокус, получают ключевые события.Поскольку у вас есть scene.getRoot().requestFocus(), это корень, который получает события.Однако вы добавляете свой EventHandler к imgFieldView, и поскольку этот узел является потомком корня, он никогда не видит никаких ключевых событий.Вам нужно либо imgFieldView получить фокус или добавить свой обработчик вместо корневого узла.

Примечание: Вы можете запросить фокус только тогда, когда цель Node является частью Scene.

Другая проблема - ваш вызов imgFieldView.setOnKeyPressed(...) в методе getNewImageHandler.Когда вы добавляете обработчик событий через FXML, например, используя onKeyPressed="#getNewImageHandler", он устанавливает соответствующее свойство onXXX узла.В вашем случае он устанавливает onKeyPressed свойство imgFieldView.Однако в этом обработчике вы также устанавливаете это свойство, которое заменяет обработчик, установленный на FXMLLoader.Ваш новый обработчик просто увеличивает или уменьшает поле photoSwipeCounter, но ничего не делает с новым значением.Ваш метод должен выглядеть примерно так:

@FXML
public void getNewImageHandler(KeyEvent event) {
    if (event.getCode().equals(KeyCode.N)) {
        photoSwipeCounter++;
    }
    if (event.getCode().equals(KeyCode.P)) {
        photoSwipeCounter--;
    }

    // wrap around logic
    if (photoSwipeCounter < 0) {
        photoSwipeCounter = selectedImgsList.size() - 1;
    } else if (photoSwipeCounter >= selectedImgsList.size()) {
        photoSwipeCounter = 0;
    }

    singleFile = selectedImgsList.get(photoSwipeCounter);

    image = new Image(singleFile.toURI().toString(),
            900, 400,
            true, true, true);
    imgFieldView.setImage(image);
}
...