3 votes

Comment intercepter le masquage d'une popup pour la validation d'un champ ?

J'ai une fenêtre contextuelle qui affiche un TextField sur le clic droit de celui-ci. Il se cache automatiquement, mais je veux l'empêcher de se cacher si la valeur du champ n'est pas un nombre. Comment consommer l'"événement de masquage" en cliquant ailleurs, sur la base d'une validation.

enter image description here

Voici mon code :

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.input.MouseButton;
import javafx.scene.layout.HBox;
import javafx.scene.layout.StackPane;
import javafx.stage.Popup;
import javafx.stage.Stage;
import javafx.stage.WindowEvent;
import org.apache.commons.lang3.math.NumberUtils;

public class Test extends Application
{

    @Override
    public void start(Stage primaryStage)
    {
        HBox root = new HBox();

        TextField textField = new TextField();

        Popup popup = new Popup();
        popup.setAutoHide(true);
        popup.getContent().clear();
        popup.getContent().addAll(textField);

        popup.setOnCloseRequest((WindowEvent event) ->
        {
            if (NumberUtils.isParsable(textField.getText()))
            {
                System.out.println("is a number");
                textField.setStyle(null);
            } else
            {
                System.out.println("enter a number");
                textField.setStyle("-fx-border-color: red ; -fx-border-width: 1px ;");
                event.consume();
            }
        });

        Label label = new Label("click here");
        StackPane labelPane = new StackPane(label);

        label.setOnMouseClicked(event ->
        {
            if (event.getButton() == MouseButton.SECONDARY)
            {
                if (!popup.isShowing())
                {

                    popup.show(labelPane, event.getScreenX() + 10, event.getScreenY());
                }
            }
        });

        root.getChildren().add(labelPane);
        Scene scene = new Scene(root, 300, 250);

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

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args)
    {
        launch(args);
    }

}

3voto

adxl Points 752

Une solution consiste à ajouter un écouteur à la fonction TextField qui définira le Popup propriété autoHide lors de la validation :

textField.textProperty().addListener(c->
                        {
                             if(NumberUtils.isParsable(textField.getText()))
                             {
                                 popup.setAutoHide(true);
                                 textField.setStyle(null);
                             }else {
                                popup.setAutoHide(false);
                                textField.setStyle("-fx-border-color: red ; -fx-border-width: 1px ;");
                             }
                         });

Cela ne permettra pas à la Popup à masquer si le type de contenu actuel n'est pas un nombre.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X