it-swarm.com.ru

Запретить/отменить закрытие основного этапа в 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); с обоими двумя способами следующим образом:

  1. OnCloseRequest версия

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

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

  2. OnHiding версия

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

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

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

22
Jomoos

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

Platform.setImplicitExit(false);

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

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

2
tomsontom

Я думаю, что это ошибка в 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);
    }
}
2
kylejmcintyre

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

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

                    }
                });
0
Christopher Vasiliou