簡體   English   中英

JavaFX ScrollPane禁用箭頭鍵滾動

[英]JavaFX ScrollPane Disable scroll by arrow keys

在這種情況下,請您提供一些建議:我有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);
        }
    });

但是不幸的是那沒有用。

我還能做什么? 非常感謝,羅馬

我已經更改了您使用事件的方式,這不會阻止按鈕獲取鍵事件,並且遍歷節點的方式通常是使用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); }
}

我認為這不起作用的原因是,該事件首先進入滾動窗格,然后從那里傳遞到按鈕,並且當您過濾該事件時,它不會繼續傳遞該事件。 但是,如果沒有其他人想闡述或告訴我錯了,我沒有事實可以支持,我將刪除此解釋

謝謝。 我進行了一些研究,得出的結論是事件到達了按鈕,但是某些東西阻止了“焦點功能”,並且焦點不會移至下一個按鈕((但是,如果我按“ 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);
}

}

有什么想法要解決“焦點問題”嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM