Как НЕМЕДЛЕННО (<= 1 сек.) Показывать всплывающее сообщение «WAIT», пока ввод пользователя заблокирован, а затем скрыть, когда пользователь может ввести - PullRequest
0 голосов
/ 27 декабря 2018

Как это сделать в JavaFX 8 ????Как заставить «PLEASE WAIT» появляться / показываться НЕМЕДЛЕННО (т.е. через <1 секунду), после того, как шоу выполнено ... не ждать, пока пользователь снова не получит контроль ввода - то есть, когда я хочу скрыть ожидание !!!!! </p>

Требуются: A) Окно / этап «Пожалуйста, подождите», которое PopsUp / показывает в приложении JavaFX 8 (в течение времени, когда пользователь не имеет элемента управления вводом, пока процессы выполняются в фоновом режиме.)

B) Это окно «Пожалуйста, подождите» выше, показано ... становится видимым и должно отображаться НЕМЕДЛЕННО при вызове, а не после выполнения следующего кода.

Что у меня работает: Часть А.Я могу показать и скрыть окно «Пожалуйста, подождите» / stage.

Проблема: Когда вызывается show (), это НЕ НЕМЕДЛЕННО.Фактически, даже несмотря на то, что вызовы Show выполняются ДО следующего выполнения кода с блокировкой потоков, всплывающее окно остается без изменений, пока пользователь не получит контроль над вводом (т. Е. После выполнения фонового кода и пользователь может нажимать кнопки на экране).Это сводит на нет всю цель всплывающего окна, которое состоит в том, чтобы уведомить пользователя о том, что он не пытается вводить данные, поскольку входы блокируются кодом, выполняющимся в фоновом режиме.Platform.runLater (() -> {функции вызваны} и 2) Скрытие / отображение других этапов, с показом фонового этапа или без него.

Методы, которые я уже пытался реализовать, ".show ()": всеСледующие ведут себя ЖЕ !!!!(они задерживаются до тех пор, пока Tread не станет свободным для ввода пользователем)

1) Простая метка и всплывающее окно:

 // >>>>>> Popup WAIT Box: >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
static Stage dialog_WAIT_Stage = new Stage();
  //<Add above Instantiator AFTER LAYO values are set>
static MyDialog_WAIT dialog_WAIT;
static Label lblDisplayDialogWAIT_Msg;
static double popupWAIT_x, popupWAIT_y, popupWAIT_w, popupWAIT_h;
static Group grpRootMyDialog_WAIT;

static class MyDialog_WAIT extends Stage {
    public MyDialog_WAIT (Stage owner, boolean modality, double lmwWidth, double lmwHeight) {
        super();
        initOwner(owner);
        Modality m = modality ? Modality.APPLICATION_MODAL : Modality.NONE; //APPLICATION_MODAL
        initModality(m);
        setOpacity(.50);   //.45; Keep lighter so User can Read Prompt while Waiting.  .80 
        initStyle(StageStyle.TRANSPARENT);

        popupWAIT_w = lmwWidth * .15;
        popupWAIT_h = lmwHeight * .15 * (lmwWidth/lmwHeight);  //Multiple by RatioFactor to get Square
        popupWAIT_x = (lmwWidth - popupWAIT_w) * .5;
        popupWAIT_y = (lmwHeight - popupWAIT_h) * .5;
        setX(popupWAIT_x);
        setY(popupWAIT_y);

        grpRootMyDialog_WAIT = new Group();
        Scene scene = new Scene(grpRootMyDialog_WAIT, popupWAIT_w+(popupWAIT_w*.2), popupWAIT_h+(popupWAIT_h*.2), Color.TRANSPARENT);
        setScene(scene);
        scene.setCursor(Cursor.WAIT);

         //Message Label
        lblDisplayDialogWAIT_Msg = new Label("Please\nWAIT...");
        lblDisplayDialogWAIT_Msg.setFont(Font.font ("Calibri", FontWeight.BOLD, LAYO_Splashscreen_WIDTH * .067));//50
        lblDisplayDialogWAIT_Msg.setBackground(new Background(new BackgroundFill(Color.YELLOW, new CornerRadii(115/*113*/), Insets.EMPTY)));
        lblDisplayDialogWAIT_Msg.setPrefWidth(popupWAIT_w);  //This Label is Entire PopupWindow
        lblDisplayDialogWAIT_Msg.setPrefHeight(popupWAIT_h);

        lblDisplayDialogWAIT_Msg.setAlignment(Pos.CENTER);
        lblDisplayDialogWAIT_Msg.setPadding(new Insets(LAYO_Splashscreen_HEIGHT * .021, LAYO_Splashscreen_WIDTH * .020, LAYO_Splashscreen_HEIGHT * .021, LAYO_Splashscreen_WIDTH * .020));  //Insets(top, right, bottom, left)(10, 15, 10, 15)


         //DropShadow Around Entire Window
        DropShadow dropShadow = new DropShadow();
        dropShadow.setOffsetX(LAYO_Splashscreen_WIDTH * .013);//10
        dropShadow.setOffsetY(LAYO_Splashscreen_HEIGHT * .021);//10
        dropShadow.setColor(Color.rgb(50, 50, 50, .588));
        lblDisplayDialogWAIT_Msg.setEffect(dropShadow);

        lblDisplayDialogWAIT_Msg.setCache(true); //debug: did not show
        lblDisplayDialogWAIT_Msg.setVisible(true);

        grpRootMyDialog_WAIT.getChildren().add(lblDisplayDialogWAIT_Msg);
        grpRootMyDialog_WAIT.setVisible(true);

    }
}
// <<<<<<< Popup WAIT Box: //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

2) Java Popup () объект:

    // >>>>>>>> Popup() example-test >>>>>>>>>>>>
    popup = new Popup();
    popup.setAutoFix(true);
    popup.setAutoHide(true);
    popup.getContent().add(grpRootMyDialog_WAIT);

    popup.show(stageSplashscreen, LAYO_Splashscreen_WIDTH * .75, LAYO_Splashscreen_HEIGHT * .6);
    // <<<<<<<<<< Popup() example-test <<<<<<<<<<<<<<<<<<<<<<<<

3) Анимации по временной шкале Таймеры, устанавливаемые на 1 миллисекундный ответ.

-WorkerThread setDeamon (false) -WorkerThread setDeamon (true)

// >>>>>> PleaseWait Popup >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
static Timeline timelinePLEASE_WAIT_show, timelinePLEASE_WAIT_hide;


public void SetupPopup_PLEASE_WAIT() {
    timelinePLEASE_WAIT_show = new Timeline(new KeyFrame(Duration.millis(1), ev -> {
        timelinePLEASE_WAIT_hide.stop();
        EmpathyPlay.dialog_WAIT.show();

    }));
    timelinePLEASE_WAIT_show.setCycleCount(1);
    timelinePLEASE_WAIT_show.setCycleCount(1);

    timelinePLEASE_WAIT_hide = new Timeline(new KeyFrame(Duration.millis(1), ev -> {
        timelinePLEASE_WAIT_show.stop();
        EmpathyPlay.dialog_WAIT.hide();
    }));
    timelinePLEASE_WAIT_hide.setCycleCount(1);
    timelinePLEASE_WAIT_hide.setCycleCount(1);

}

4)

static class WorkerThread_show_play extends Thread {
    public WorkerThread_show_play() {
         //When false, (i.e. when it's a user thread),
         //the Worker thread continues to run.
         //When true, (i.e. when it's a daemon thread),
         //the Worker thread terminates when the main 
         //thread terminates.
        setDaemon(true); 
        this.setPriority(MAX_PRIORITY);
    }
    public void run() {
        timelinePLEASE_WAIT_hide.stop();
        timelinePLEASE_WAIT_show.play();
    }
}    

static class WorkerThread_hide_play extends Thread {
    public WorkerThread_hide_play() {
         //When false, (i.e. when it's a user thread),
         //the Worker thread continues to run.
         //When true, (i.e. when it's a daemon thread),
         //the Worker thread terminates when the main 
         //thread terminates.
        setDaemon(true); 
        this.setPriority(MAX_PRIORITY);
    }
    public void run() {
        timelinePLEASE_WAIT_show.stop();
        timelinePLEASE_WAIT_hide.play();
        EmpathyPlay.dialog_WAIT.hide();
    }
}    
//<<<<<<< PleaseWait Popup <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
...