有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java JavaFX滚动窗格禁用按箭头键滚动

在这种情况下,请您提出建议: 我有滚动窗格和网格窗格。在GridPane中,我有许多按钮。当我用鼠标聚焦一个按钮并尝试用箭头键移动焦点时,焦点仍然停留在同一个按钮上,而我只看到滚动窗格滚动

如何禁用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);
        }
    });

但不幸的是,这并没有奏效

我还能做什么? 非常感谢,, 罗马人


共 (2) 个答案

  1. # 1 楼答案

    我已经改变了您使用事件的方式,这不会阻止按钮获取关键事件,而且您遍历节点的方式通常是使用tab按钮,但我不知道您实现了什么。当焦点在按钮上时,这会打印出你按下的每个键,而不会滚动

    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); }
    }
    

    我认为这不起作用的原因是,事件首先进入滚动窗格,然后从那里传递到按钮,当你过滤事件时,它不会传递事件。但我没有事实支持这一点,如果其他人想详细说明或告诉我我错了,我将删除这个解释

  2. # 2 楼答案

    谢谢。我做了一些研究,得出结论,事件到达了按钮,但有东西阻止了“聚焦功能”,而聚焦没有移动到下一个按钮(( 但如果我按tab键,然后集中注意力移动!如何通过按箭头键进行移动? 看到我的代码了吗

    package testjavafxscrollpane;
    import javafx.application.Application;
    import javafx.event.ActionEvent;
    import javafx.event.EventHandler;
    import javafx.scene.Scene;
    import javafx.scene.control.Button;
    import javafx.scene.control.ScrollPane;
    import javafx.scene.input.KeyCode;
    import javafx.scene.layout.StackPane;
    import javafx.scene.layout.VBox;
    import javafx.stage.Stage;
    public class TestJavaFXScrollPane extends Application {
    
    @Override
    public void start(Stage primaryStage) {
        Button btn0 = new Button("Btn0");
        btn0.setOnKeyPressed((event) -> {
            System.out.println("btn.KeyPressed; Code: " + event.getCode());
        });
        Button btn1 = new Button("Btn1");
        Button btn2 = new Button("Btn2");
        Button btn3 = new Button("Btn3");
    
        VBox root = new VBox();
        root.getChildren().addAll(btn0, btn1, btn2, btn3);
    
        ScrollPane scrollPane = new ScrollPane(root);
        scrollPane.setOnKeyPressed(event -> {
            //if(event.getCode() == KeyCode.DOWN || event.getCode() == KeyCode.UP)
                //event.consume();
        });
    
        Scene scene = new Scene(scrollPane, 100, 80);
    
        primaryStage.setTitle("Hello World!");
        primaryStage.setScene(scene);
        primaryStage.show();
    }
    
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        launch(args);
    }
    

    }

    有没有解决“焦点问题”的办法