Java FX не распознает KeyCode.UP или KeyCode.Down при нажатии стрелок вверх и вниз (MacBook Pro 18 - Mojave 10.14.5) - PullRequest
0 голосов
/ 18 мая 2019

В настоящее время я изучаю Java и работаю над программированием на основе событий с помощью Java FX. Эта программа создает круг и увеличивает его размер несколькими различными способами (кнопки, кнопки мыши, стрелки вверх и вниз).

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

Я фактически скопировал эту программу из книги для практики, и она идентична моему коду ...

Я использую MacBook Pro 18 на Mojave 10.14.5. Java 10, IntelliJ Community Edition 2019.1.

Код ниже, любая помощь будет оценена.

package testing2;

import javafx.application.Application; import javafx.geometry.Pos; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.input.KeyCode; import javafx.scene.input.MouseButton; import javafx.scene.layout.BorderPane; import javafx.scene.layout.HBox; import javafx.scene.layout.StackPane; import javafx.scene.paint.Color; import javafx.scene.shape.Circle; import javafx.stage.Stage;

public class ControlCircleWithMouseAndKey extends Application {
    private CirclePane circlePane = new CirclePane();

    @Override
    public void start(Stage primaryStage) {
        //hold 2 buttons in an Hbos
        HBox hBox = new HBox();
        hBox.setSpacing(10);
        hBox.setAlignment(Pos.CENTER);

        Button btEnlarge = new Button("Enlarge");
        Button btShrink = new Button("Shrink");
        hBox.getChildren().addAll(btEnlarge, btShrink);

        //Create and register button click handlers
        btEnlarge.setOnAction(e -> circlePane.enlarge());
        btShrink.setOnAction(e -> circlePane.shrink());

        BorderPane borderPane = new BorderPane();
        borderPane.setCenter(circlePane);
        borderPane.setBottom(hBox);
        borderPane.setAlignment(hBox, Pos.CENTER);

        Scene scene = new Scene(borderPane, 200, 200);
        primaryStage.setTitle("Change Circle");
        primaryStage.setScene(scene);
        primaryStage.show();

        //Register the mouse clicks enlarge and shrink
        circlePane.setOnMouseClicked(e -> {
            if (e.getButton() == MouseButton.PRIMARY) {
                circlePane.enlarge();
            } else if (e.getButton() == MouseButton.SECONDARY) {
                circlePane.shrink();
            }
        });

        //Register keys to englarge and shrink
        scene.setOnKeyPressed(e -> {
            if (e.getCode() == KeyCode.UP) {
                circlePane.enlarge();
            } else if (e.getCode() == KeyCode.DOWN) {
                circlePane.shrink();
            } else {
                System.out.println(e.getCode());
            }
        });

    } }

class CirclePane extends StackPane {
    private Circle circle = new Circle(50);

    public CirclePane() {
        getChildren().add(circle);
        circle.setStroke(Color.BLACK);
        circle.setFill(Color.WHITE);
    }

    public void enlarge() {
        circle.setRadius(circle.getRadius() + 2);
    }

    public void shrink() {
        circle.setRadius(circle.getRadius() > 2 ? circle.getRadius() - 1 : circle.getRadius());
    } }

1 Ответ

0 голосов
/ 18 мая 2019

Вы использовали «scene» для регистрации нажатий клавиш. Разве это не должно быть 'borderPane' (все зависит от фокуса, я думаю)?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...