Перемещение фокуса с помощью проблем с клавиатурой - PullRequest
0 голосов
/ 06 июля 2018

Пожалуйста, помогите. Ситуация: у нас есть VBox с большим количеством кнопок (и я могу прокручивать фокус вверх / вниз с помощью клавиш со стрелками на моей клавиатуре), но они не помещаются в маленькую форму, поэтому мне нужна вертикальная прокрутка. Я применяю ScrollPane - и в конце концов все стало хорошо, кроме перемещения фокуса. Когда я нажимаю клавиши со стрелками вверх / вниз, фокус останавливается, но влияет на прокрутку. Мне нужно отключить прокрутку клавиш с помощью ScrollPane (используйте только мышь!) И включить перемещение фокуса клавишами вверх / вниз. Не могли бы вы помочь мне, как я мог это сделать?

Большое спасибо!

Вот мой код

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(); // Tried to fix issue, but without result ((
    });

    Scene scene = new Scene(scrollPane, 100, 80);

    primaryStage.setTitle("Hello World!");
    primaryStage.setScene(scene);
    primaryStage.show();
}


public static void main(String[] args) {
    launch(args);
}
}

1 Ответ

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

Сам нашел решение (это правильно?)

class MyEventHandler implements EventHandler<KeyEvent> {
@Override
public void handle(KeyEvent event) {
    if(event.getCode() == KeyCode.UP) {
            Object t0 = event.getSource();
            if (!(t0 instanceof Button))
                return;
            ((BehaviorSkinBase) ((Button)t0).getSkin()).getBehavior().traversePrevious();

        } else if(event.getCode() == KeyCode.DOWN) {
            Object t0 = event.getSource();
            if (!(t0 instanceof Button))
                return;
            ((BehaviorSkinBase) ((Button)t0).getSkin()).getBehavior().traverseNext();

        }
}

public static void ProcessBurrons(Button... btns) {
    if(btns == null && btns.length == 0) return;
    for(Button el : btns) {
        el.setOnKeyPressed(new MyEventHandler());
    }
}

}

...