JavaFX ScrollPane禁用箭头键滚动

时间:2018-07-05 10:55:01

标签: java javafx scroll focus scrollpane

在以下情况下,您能否提供建议? 我有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);
        }
    });

但不幸的是,这没有用。

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

2 个答案:

答案 0 :(得分:0)

我已经更改了您使用事件的方式,这不会阻止按钮获取键事件,并且遍历节点的方式通常是使用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); }
}

为什么我认为这不起作用,是因为该事件首先进入滚动窗格,然后从那里传递到按钮,并且当您过滤该事件时,它没有传递该事件。但是,如果没有其他人想阐述或告诉我错了,我没有任何事实可以支持,我将删除此解释

答案 1 :(得分:0)

谢谢。我进行了一些研究,得出的结论是事件到达了按钮,但是某些东西阻止了“焦点功能”,并且焦点不会移至下一个按钮(( 但是,如果我按“制表符”,则焦点会移动!如何通过按箭头键启用移动? 查看我的代码

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

}

有什么想法要解决“焦点问题”吗?