Schubidu
Schubidu

Reputation: 325

How can I center the virtual keyboard on bottom before it is shown - javafx

How can I center the keyboard on the bottom of the screen? I just have the sizes of the keyboard/PopupWindow after the board is already shown. Before calling show() every function returns 0.0 for the asked width. I could set the position correctly if I just knew the width before. The keyboard size might change later, that's why I can't do it with a set size. I am using the fx-onscreen-keyboard

My little service:

public class KeyboardService {

private double screenWidth = Screen.getPrimary().getVisualBounds().getWidth();
private double screenHight = Screen.getPrimary().getVisualBounds().getHeight();
private double keyboardPosX = 0.0;
private double keyboardPosY = 0.0; 

private KeyBoardPopup keyboardPopup;

public KeyboardService() {
    keyboardPopup = KeyBoardPopupBuilder.create().initLocale(Locale.GERMAN).build();
    keyboardPopup.setAutoHide(true);
    keyboardPopup.setConsumeAutoHidingEvents(false);
    keyboardPopup.getKeyBoard().setScale(2.5);
    keyboardPopup.getKeyBoard().setLayer(DefaultLayer.DEFAULT);

    keyboardPopup.getKeyBoard().setOnKeyboardCloseButton((e) -> {
        keyboardPopup.hide();
    });

}

public void showKeyboard(Node node){
    keyboardPosX = (screenWidth - keyboardPopup.getWidth())/2;
    //keyboardPosX = (screenWidth - keyboardPopup.getKeyBoard().getWidth())/2;
    keyboardPosY = screenHight;
    keyboardPopup.show(node, keyboardPosX, keyboardPosY);
}}

Upvotes: 0

Views: 298

Answers (1)

José Pereda
José Pereda

Reputation: 45476

The width of the keyboard is defined when the popup that holds it is laid out, what happens right after you call show.

The easy way to do this is by listening to the widthProperty of the KeyBoardPopup, to get the new value, and then moving the window of the popup accordingly.

This will do:

public KeyboardService() {
    keyboardPopup = KeyBoardPopupBuilder.create().initLocale(Locale.GERMAN).build();
    keyboardPopup.setAutoHide(true);
    keyboardPopup.setConsumeAutoHidingEvents(false);
    keyboardPopup.getKeyBoard().setScale(2.5);
    keyboardPopup.getKeyBoard().setLayer(DefaultLayer.DEFAULT);

    keyboardPopup.getKeyBoard().setOnKeyboardCloseButton((e) -> {
        keyboardPopup.hide();
    });

    // listen to width changes and center 
    keyboardPopup.widthProperty().addListener((obs, ov, nv) -> {
        keyboardPosX = (screenWidth - nv.doubleValue()) / 2d;
        keyboardPopup.getScene().getWindow().setX(keyboardPosX);
    });
}

public void showKeyboard(Node node) {
    keyboardPosX = (screenWidth - keyboardPopup.getWidth())/2;
    keyboardPosY = screenHeight;
    keyboardPopup.show(node, keyboardPosX, keyboardPosY);
}

Upvotes: 1

Related Questions