更改照片的KeyEvent无法使用,如何激活它?

时间:2019-05-30 06:29:34

标签: java javafx fxml keyevent

我想使用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上加载第一张照片,并且可以通过将它从文件夹加载到列表中来工作,但是切换到下一个nope

1 个答案:

答案 0 :(得分:3)

只有具有焦点的节点才接收关键事件。由于您拥有scene.getRoot().requestFocus(),因此它是接收事件的根。但是,您要将EventHandler添加到imgFieldView,并且由于该节点是根的后代,因此它永远不会看到任何键事件。您需要让imgFieldView获得焦点,或者将处理程序添加到根节点。

注意:仅当目标NodeScene的一部分时,您才能请求焦点。

另一个问题是您在imgFieldView.setOnKeyPressed(...)方法中调用getNewImageHandler。例如,通过FXML添加事件处理程序时,例如使用onKeyPressed="#getNewImageHandler",它将设置节点的相应onXXX属性。您的情况是设置onKeyPressed的{​​{1}}属性。但是,您还可以在该处理程序中设置该属性,以替换由imgFieldView设置的处理程序。您的新处理程序仅增加或减少FXMLLoader字段,但对新值不执行任何操作。您的方法应类似于:

photoSwipeCounter