JavaFX ScrollPane Отключить прокрутку клавишами со стрелками - PullRequest
0 голосов
/ 05 июля 2018

Не могли бы вы посоветовать в ситуации: У меня есть 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);
        }
    });

Но, к сожалению, это не сработало.

Что еще я мог сделать? Большое спасибо, Roman

Ответы [ 2 ]

0 голосов
/ 06 июля 2018

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

}

Есть какие-нибудь мысли, как решить проблему фокусировки?

0 голосов
/ 05 июля 2018

Я изменил способ, которым вы использовали событие, это не помешает кнопке получить ключевое событие, а также то, как вы проходите узлы, как правило, с помощью кнопки табуляции, но я понятия не имею, что вы реализовали. это будет распечатывать каждую нажатую клавишу, когда фокус находится на кнопке без прокрутки

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

Почему я думаю, что это не сработало, потому что событие сначала отправляется на полосу прокрутки, а оттуда оно передается кнопке, а когда вы фильтруете событие, оно не передает событие. Но у меня нет фактов, подтверждающих это, если кто-то еще хочет уточнить или сказать, что я неправ, я уберу это объяснение

...