Я изменил способ, которым вы использовали событие, это не помешает кнопке получить ключевое событие, а также то, как вы проходите узлы, как правило, с помощью кнопки табуляции, но я понятия не имею, что вы реализовали. это будет распечатывать каждую нажатую клавишу, когда фокус находится на кнопке без прокрутки
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); }
}
Почему я думаю, что это не сработало, потому что событие сначала отправляется на полосу прокрутки, а оттуда оно передается кнопке, а когда вы фильтруете событие, оно не передает событие. Но у меня нет фактов, подтверждающих это, если кто-то еще хочет уточнить или сказать, что я неправ, я уберу это объяснение