Как перехватить скрытие Popup для проверки поля - PullRequest
3 голосов
/ 17 марта 2020

У меня есть всплывающее окно, которое показывает TextField по правому клику. Он автоматически скрывается, но я хочу предотвратить его скрытие, если значение в поле не является числом. Как вы потребляете «событие скрытия» при нажатии, основываясь на некоторой проверке.

enter image description here

Вот мой код:

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);
    }


}

1 Ответ

3 голосов
/ 18 марта 2020

Одним из решений является добавление слушателя к TextField, который при проверке установит свойство Popup autoHide:

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 ;");
                             }
                         });

Это не позволит Popup скрыться, если текущий тип содержимого не является числом.

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