der*_*itz 5 java events javafx keyevent
我正在尝试捕获按键事件(向上和向下翻页),但根本没有收到任何按键事件。这是相关代码: 构造函数:
private MainLayout() {
imageView = new ImageView();
root = new StackPane();
root.getChildren().add(imageView);
root.setFocusTraversable(true); //no effect
//root.requestFocus(); //also no effect
registerEvents();
}
Run Code Online (Sandbox Code Playgroud)
关于焦点的两条线都没有效果。堆栈窗格直接添加到场景中。除了Scene->StackPane->ImageView之外没有其他节点。我能够捕获场景中的关键事件,但我需要在堆栈窗格中捕获它们
这是registerEvents(),所有其他事件都捕获良好!:
private void registerEvents() {
OnScroll onScroll = new OnScroll();
root.setOnScroll(onScroll);
OnResize onResize = new OnResize();
root.heightProperty().addListener(onResize);
root.widthProperty().addListener(onResize);
OnMouseDown onMouseDown = new OnMouseDown();
root.setOnMousePressed(onMouseDown);
root.setOnMouseReleased((event) -> fitImage());
root.setOnDragOver((event) -> dragOver(event));
root.setOnDragDropped((event) -> dropFile(event));
root.setOnKeyPressed((event) -> {
LOG.debug("Key captured.");
if(event.getCode() == KeyCode.PAGE_UP){
imageView.setImage(ip.prev());
event.consume();
} else if(event.getCode() == KeyCode.PAGE_DOWN){
imageView.setImage(ip.next());
event.consume();
}
if(event.isConsumed()){
fitImage();
}
});
Run Code Online (Sandbox Code Playgroud)
我没有看到注销,也没有捕获断点。那么如何正确捕获并处理关键事件呢?
我不知道这个答案是否会让您满意,但我会将处理事件从此类移至初始化场景的类,并将事件附加到场景本身(因为在StackPane某种程度上,场景)。我猜测,由于代码中的构造函数是私有的,因此您正在通过另一个类的公共静态方法实例化该类。
public class MainClass extends Application {
private Scene scene = new Scene(MainLayout.getMainLayout());
@Override
public void start(Stage primaryStage) throws Exception {
registerEvents();
primaryStage.setScene(scene);
primaryStage.show();
}
private void registerEvents() {
OnScroll onScroll = new OnScroll();
scene.setOnScroll(onScroll);
OnResize onResize = new OnResize();
scene.heightProperty().addListener(onResize);
scene.widthProperty().addListener(onResize);
OnMouseDown onMouseDown = new OnMouseDown();
scene.setOnMousePressed(onMouseDown);
scene.setOnMouseReleased((event) -> fitImage());
scene.setOnDragOver((event) -> dragOver(event));
scene.setOnDragDropped((event) -> dropFile(event));
scene.setOnKeyPressed((event) -> {
LOG.debug("Key captured.");
if (event.getCode() == KeyCode.PAGE_UP) {
imageView.setImage(ip.prev());
event.consume();
} else if (event.getCode() == KeyCode.PAGE_DOWN) {
imageView.setImage(ip.next());
event.consume();
}
if (event.isConsumed()) {
fitImage();
}
});
}
}
Run Code Online (Sandbox Code Playgroud)
或者,如果您想在类中保留用于处理事件的代码MainLayout,请考虑使registerEvents公共(或本地包,取决于您的设计)方法接受Scene作为参数。
| 归档时间: |
|
| 查看次数: |
2922 次 |
| 最近记录: |