更改照片的KeyEvent不起作用,如何激活它?
KeyEvent to change photos dosen't work, how to activate it?
我想使用 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
只有获得焦点的节点才会接收按键事件。因为你有 scene.getRoot().requestFocus()
它是接收事件的根。但是,您将 EventHandler
添加到 imgFieldView
并且由于该节点是根的后代,因此它永远不会看到任何关键事件。您需要让 imgFieldView
获得焦点或将处理程序添加到根节点。
注意:只有当目标 Node
是 Scene
的一部分时,您才能请求焦点。
另一个问题是您在 getNewImageHandler
方法中调用 imgFieldView.setOnKeyPressed(...)
。当您通过 FXML 添加事件处理程序时,例如使用 onKeyPressed="#getNewImageHandler"
,它会设置节点的相应 onXXX
属性。在您的例子中,它设置了 imgFieldView
的 onKeyPressed
属性。但是,在该处理程序中,您还设置了 属性,它替换了由 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);
}
我想使用 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
只有获得焦点的节点才会接收按键事件。因为你有 scene.getRoot().requestFocus()
它是接收事件的根。但是,您将 EventHandler
添加到 imgFieldView
并且由于该节点是根的后代,因此它永远不会看到任何关键事件。您需要让 imgFieldView
获得焦点或将处理程序添加到根节点。
注意:只有当目标 Node
是 Scene
的一部分时,您才能请求焦点。
另一个问题是您在 getNewImageHandler
方法中调用 imgFieldView.setOnKeyPressed(...)
。当您通过 FXML 添加事件处理程序时,例如使用 onKeyPressed="#getNewImageHandler"
,它会设置节点的相应 onXXX
属性。在您的例子中,它设置了 imgFieldView
的 onKeyPressed
属性。但是,在该处理程序中,您还设置了 属性,它替换了由 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);
}