Подтвердить что ты не робот

Предотвращение/Отмена закрытия основного этапа в JavaFX 2.2

Как гласит название, мой вопрос в том, как я могу предотвратить/отменить закрытие основного этапа в JavaFX 2.2? Я провел некоторое исследование в Google, и следующие две ссылки, похоже, решили проблему:

Я пробовал методы, объясненные этими двумя ссылками, но, к сожалению, для меня никто не работает. Итак, без дальнейших церемоний, вот что я сделал.

Во-первых, я попытался прикрепить OnCloseRequest к primaryStage следующим образом.

primaryStage.setOnCloseRequest(new EventHandler<WindowEvent>() {
    @Override
    public void handle(WindowEvent event) {
        if (!canExit()) {
            event.consume();
            primaryStage.show(); // I tried without this line also.
        }
    }
});

Когда canExit() возвращает false, я попытался предотвратить дальнейшее распространение события и вызвать выход из приложения, вызвав event.consume(). Но сцена закрывается/скрывается, и я получаю следующие сообщения об ошибках в окне вывода Netbeans. Он продолжает поступать повторно, пока я не закрою приложение из Netbeans.

(java:6731): Gtk-CRITICAL **: IA__gtk_widget_get_visible: assertion `GTK_IS_WIDGET (widget)' failed

(java:6731): Gtk-CRITICAL **: IA__gtk_widget_get_visible: assertion `GTK_IS_WIDGET (widget)' failed

(java:6731): Gtk-CRITICAL **: IA__gtk_widget_get_visible: assertion `GTK_IS_WIDGET (widget)' failed

Попробовав провал в этой попытке, я изменил OnCloseRequest на OnHiding на ожидание успеха.

primaryStage.setOnHiding(new EventHandler<WindowEvent>() {
    @Override
    public void handle(WindowEvent event) {
        if (!canExit()) {
            event.consume();
            primaryStage.show(); // I tried without this line also.
        }
    }
});

Хотя, я тоже пробовал провал в этой попытке, я думаю, что добился определенного прогресса. На этот раз сообщений об ошибках нет, и нет необходимости принудительно закрыть приложение из Netbeans.

Затем я прочитал о каком-то магическом методе с именем setImplicitExit() в классе Platform. Думая, что это то, чего я не хватало, я пробовал Platform.setImplicitExit(false); с обоими из двух методов следующим образом:

  • OnCloseRequest версия

    Platform.setImplicitExit(false);
    
    primaryStage.setOnCloseRequest(new EventHandler<WindowEvent>() {
        if (!canExit()) {
            // ...
        } else {
            Platform.exit();
        }
    });
    

    Нет разницы, этап закрывается/скрывается, и одно и то же сообщение об ошибке появляется повторно.

  • OnHiding версия

    Platform.setImplicitExit(false);
    
    primaryStage.setOnHiding(new EventHandler<WindowEvent>() {
        if (!canExit()) {
            // ...
        } else {
            Platform.exit();
        }
    });
    

    Начиная с положительной ноты, приложение не выходит из него, как раньше. Но отрицательная нота заключается в том, что этап все еще закрывается/скрывается.

Теперь я из оружия/экипировки в своем арсенале, чтобы решить это, и поэтому я здесь, чтобы просить помощи у вас, героев и чемпионов. Итак, как я могу решить эту проблему или что я сделал неправильно или что мне не хватает?

4b9b3361

Ответ 1

Я использовал следующий код в своем приложении и отлично работает,

Platform.setImplicitExit(false);

primaryStage.setOnCloseRequest(new EventHandler<WindowEvent>() {
    @Override
    public void handle(WindowEvent event) {
        event.consume();
    }
});

Ответ 2

Я думаю, что вы ошиблись в onCloseRequest(). Если вы уничтожаете событие, вы отменяете закрытие! Таким образом, это работает другой, почему round, если canExit() возвращает false, вы потребляете событие

Ответ 3

Я думаю, что это ошибка с JavaFX для Linux. Я столкнулся с той же проблемой на Javafx 2.2.21-b11. В зависимости от контекста ошибки GTK могут быть или не быть, но в любом случае использование события запроса закрытия не помешало закрытию окна (но процесс продолжает работать). Такое же приложение в Windows вел себя так, как я ожидал. Поэтому в лучшем случае у нас есть разница в поведении на разных платформах.

Я подал отчет об ошибке, который вы можете увеличить, если хотите: https://javafx-jira.kenai.com/browse/RT-33295

Здесь источник моего тестового приложения

import javafx.application.Application;
import javafx.event.EventHandler;
import javafx.stage.Stage;
import javafx.stage.WindowEvent;

public class Boom extends Application {
    @Override
    public void start(final Stage primary)  {
        System.out.println(com.sun.javafx.runtime.VersionInfo.getRuntimeVersion());
        primary.setOnCloseRequest(new EventHandler<WindowEvent>() {
            @Override
            public void handle(WindowEvent e) {
                e.consume();
            }
        });
        primary.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}

Ответ 4

Это сработало для меня

                stage.setOnCloseRequest(new EventHandler<WindowEvent>() {  
                    @Override
                    public void handle(WindowEvent event) {
                        AlertHelper addMore = new AlertHelper("Exit application? Any unsaved data will be lost", "Attention", "Confirmation Required");
                        boolean actionNeeded = addMore.populatePopup();
                        if (actionNeeded) {
                            System.exit(0);
                        } else {
                            event.consume();
                        }

                    }
                });