Предотвращение/Отмена закрытия основного этапа в 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();
}
});
Начиная с положительной ноты, приложение не выходит из него, как раньше. Но отрицательная нота заключается в том, что этап все еще закрывается/скрывается.
Теперь я из оружия/экипировки в своем арсенале, чтобы решить это, и поэтому я здесь, чтобы просить помощи у вас, героев и чемпионов. Итак, как я могу решить эту проблему или что я сделал неправильно или что мне не хватает?
Ответы
Ответ 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();
}
}
});