Using javaFx, how to distinguish between return-key and enter-key on the numpad?

66 Views Asked by At

Using javaFx, how to distinguish between return-key and enter-key on the numpad?

This is a near duplicate of Java/AWT/Swing: how to distinguish the pressed enter or return key , but for javaFX.

Unfortunately, in javaFX, there is no KeyEvent.KEY_LOCATION_NUMPAD.

1

There are 1 best solutions below

5
hedfol On

String properties of KeyEvent might contain some useful information.

The event.getText() resulted in different values for return and numpad enter keys in my tests (openjfx 21.0.2).

import javafx.application.Application;

import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyEvent;
import javafx.stage.Stage;

public class Enters extends Application {

    private static final int RETURN_KEY_CODE = 13;

    @Override
    public void start(Stage stage) {
        Label label = new Label("Press the keys");
        label.setPadding(new Insets(50));
        stage.setScene(new Scene(label));

        stage.addEventFilter(KeyEvent.KEY_PRESSED, e -> {
            if (e.getCode() != KeyCode.ENTER) {
                return;
            }
            int textCh = (e.getText().length() > 0) ? e.getText().charAt(0) : -1;
            int ch = (e.getCharacter().length() > 0) ? e.getCharacter().charAt(0) : -1;
            boolean keypadEnter = (textCh != RETURN_KEY_CODE);
            
            System.out.println(String.format(
                    "%sENTER\tTextCode:%s CharCode:%s",
                    (keypadEnter ? "NUMPAD " : ""), textCh, ch));
        });
        stage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}
ENTER   TextCode:13 CharCode:0
ENTER   TextCode:13 CharCode:0
NUMPAD ENTER    TextCode:-1 CharCode:0
ENTER   TextCode:13 CharCode:0
NUMPAD ENTER    TextCode:-1 CharCode:0

There is no guarantee that this is platform independent or that field population won't change in the future versions.