java - 更改照片的KeyEvent不起作用,如何激活它?

标签 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();
}

ofc 我有方法在 imageView 上加载第一张照片,它的工作原理是将其从文件夹加载到列表中,但切换到下一张照片

最佳答案

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

注意:只有当目标 Node 属于 Scene 的一部分时,您才能请求焦点。

另一个问题是您在 getNewImageHandler 方法中调用 imgFieldView.setOnKeyPressed(...) 。当您通过 FXML 添加事件处理程序时,例如使用 onKeyPressed="#getNewImageHandler",它会设置节点相应的 onXXX 属性。在您的情况下,它设置 imgFieldViewonKeyPressed 属性。但是,在该处理程序中,您还可以设置该属性,该属性将替换 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);
}

关于java - 更改照片的KeyEvent不起作用,如何激活它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56372842/

相关文章:

java - 如何为循环中创建的 100 个文本字段创建一个changeListener?

java - CSS JavaFX 菜单项焦点父级

JavaFX:FXML 中导入类的 ClassNotFoundException

java - 不可序列化父类的可序列化子类

java - 给定一个数字,打印接下来的三个数字

java - 使用 Netbeans 表单时出现通用 "Link Error"

javafx - 条形图的限制宽度大小

使用 FileFilter 的 JavaFX 过滤器 ListView 文件元素

java - 打开文件并将其内容设置为 JavaFX NullPointer 中的 TextArea

java - 这个 HQL 查询有什么问题?