我正在尝试捕获按键事件(向上翻页和向下翻页),但根本没有收到任何关键事件。这是相关代码: 构造:
private MainLayout() {
imageView = new ImageView();
root = new StackPane();
root.getChildren().add(imageView);
root.setFocusTraversable(true); //no effect
//root.requestFocus(); //also no effect
registerEvents();
}
关于焦点的两条线都没有效果。堆栈窗格直接添加到场景中。 除了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();
}
});
我没有看到退出登记,也没有抓住断点。那么如何正确捕捉和处理关键事件呢?
答案 0 :(得分:1)
与此同时,由于this answer,我找到了解决方案。诀窍是ImageView(堆栈窗格的子窗口)上的setFocusTraversable(true)
。这是工作代码:
@Inject
private MainLayout(ImageProvider ip) {
this.ip = ip;
imageView = new ImageView();
imageView.setFocusTraversable(true);
imageView.requestFocus();
root = new StackPane();
root.getChildren().add(imageView);
registerEvents();
}
答案 1 :(得分:0)
我不知道这个答案是否会让你满意,但是我会将这个类的处理事件移动到初始化场景的类中,并将事件附加到场景本身(自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();
}
});
}
}
或者,如果您想保留用于处理MainLayout
课程中的事件的代码,请考虑将registerEvents
设为公开(或本地包,取决于您的设计)方法,接受Scene
作为一个参数。