请您提供以下情况的建议: 我里面有 ScrollPane 和 GridPane。在 GridPane 中我有很多按钮。当我用鼠标聚焦一个按钮并尝试用箭头键移动焦点时,焦点仍然停留在同一个按钮上,我只看到 ScrollPane 滚动。
如何禁用 ScrollPane 的箭头键滚动并将该事件发送到我的子按钮。我尝试做一些事情,例如:
ScrollPane sp = new ScrollPane() {
@Override
public void requestFocus(){}
};
sp.addEventFilter(KeyEvent.ANY, (event) -> {
if(event.getCode() == KeyCode.DOWN) {
event.consume();
javafx.event.Event.fireEvent(mainGrid, event);
}
});
但不幸的是,这并没有奏效。
我还能做什么? 非常感谢, 罗马
最佳答案
我改变了您使用事件的方式,这不会阻止按钮获取关键事件,而且您遍历节点的方式通常是使用选项卡按钮,但我不知道您实现了什么。当焦点位于按钮上时,这将打印出您按下的每个键,而无需滚动
public class Main extends Application {
@Override
public void start(Stage stage) {
VBox scrollPaneVbox = new VBox();
Button button = new Button("Button");
button.setOnKeyPressed(event -> System.out.println(event.getCode().toString()));
ScrollPane scrollPane = new ScrollPane(scrollPaneVbox);
scrollPane.setPannable(true);
scrollPane.setPrefSize(150,150);
scrollPane.setOnKeyPressed(event -> {
if(event.getCode() == KeyCode.DOWN || event.getCode() == KeyCode.UP)
event.consume();
});
int i = 0;
while (i++!=21)
scrollPaneVbox.getChildren().add(new Label("Label i:"+i));
scrollPaneVbox.getChildren().add(button);
Scene scene = new Scene(scrollPane, 200,150);
stage = new Stage();
stage.setScene(scene);
stage.showAndWait();
}
public static void main(String[] args) { launch(args); }
}
为什么我认为这不起作用是因为事件首先进入滚动 Pane ,然后从那里传递到按钮,当您过滤事件时,它不会传递事件。但我没有事实支持这一点,如果其他人想详细说明或告诉我我错了,我将删除此解释
关于JavaFX ScrollPane 禁用箭头键滚动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51189527/