Search code examples
javajavafx

How to implement CAPS LOCK alert bubble on password field in JavaFX?


I’m trying to implement a caps lock alert on password field. If caps lock is ON then the bubble will appear below the password field. I’ve searched a lot but didn’t get any solution that how can I implement such bubble on input fields in JavaFX. I’ve found some source code to get the caps lock state.

    boolean isOn=Toolkit.getDefaultToolkit().getLockingKeyState(KeyEvent.VK_CAPS_LOCK);
scene.setOnKeyReleased( event -> {
            if ( event.getCode() == KeyCode.CAPS ) {
                System.out.println("Capslock pressed");
                System.out.println("Capslock state: " + isOn);
            }
        });

But my problem is how to implement the bubble alert on text field. Here you can see what I have to do.

enter image description here

It would be helpful if you suggest me some possible ways as I’m new in JavaFX. Is there any JavaFX library to do such bubble alert on input fields?


Solution

  • It sounds like you have figured out how to get the input state you could try something like this for the listener

    public class Main extends Application {
    
        private Label capsLabel = new Label("Caps is ON");
    
        private boolean capsIsOn;
    
        @Override
        public void start(Stage stage) {
            System.out.println(Toolkit.getDefaultToolkit().getLockingKeyState(20));
    
            //Try adding this line to get state on startup
            capsLabel.setVisible(Toolkit.getDefaultToolkit().getLockingKeyState(20));
    
            TextField textField = new TextField();
    
            //Also try adding this line and to check again so when the field 
            //is selected it will check again
            textField.setOnMouseClicked(event -> capsLabel.setVisible(Toolkit.getDefaultToolkit().getLockingKeyState(20)));
    
            textField.setOnKeyReleased(keyEvent -> {
                if(keyEvent.getCode().toString().equals("CAPS")){
                    capsIsOn = !capsIsOn;
                    capsLabel.setVisible(capsIsOn);
                }
            });
    
            VBox vBox = new VBox();
            vBox.getChildren().addAll(textField, capsLabel);
    
            stage = new Stage();
            stage.setScene(new Scene(vBox));
            stage.show();
        }
    
        public static void main(String[] args) { launch(args); }
    }
    

    Alternatively you could set this on a timer and have it constantly checking personally I don't like the idea of constant use of computer resources but its not my project.