powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / JavaFX, Stage.setOnCloseRequest
10 сообщений из 10, страница 1 из 1
JavaFX, Stage.setOnCloseRequest
    #38660067
korshun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день.
Нужно выполнять некие действия при закрытии Stage, для этого пытаюсь повесить обработчик setOnCloseRequest, но ничего не происходит :(
Подскажите почему ?

Stage1

Код: java
1.
2.
3.
4.
5.
6.
7.
StageController
    .createStage("estimateStage", new Stage())
    .setTitle("Смета")
    .setModality(Modality.APPLICATION_MODAL)
    .showStage("estimates/fxml/EstmateFXML.fxml");

StageController.getStage("estimateStage").setOnCloseRequest(e -> System.out.println("sdfsdf")); //Не срабатывает!




Stage2

Код: java
1.
closeButton.setOnMouseClicked(mouseEvent -> StageController.closeStage("estimateStage"));




Класс StageController

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
public class StageController {

    private String stageName;
    private Stage stage;

    private static HashMap<String, Stage> stages = new HashMap<>();

    StageController(String stageName,Stage stage){
        this.stageName = stageName;
        this.stage = stage;
    }

    public static StageController createStage(String stageName,Stage stage){
        return new StageController(stageName,stage);
    }

    public void showStage(String fxml) throws Exception {
        stages.put(stageName,stage);
        Parent scene = FXMLLoader.load(getClass().getResource(fxml));
        stage.initStyle(StageStyle.TRANSPARENT);
        stage.setScene(new Scene(scene));
        stage.show();
    }

    public StageController setModality(Modality modality) {
        stage.initModality(modality);
        return this;
    }

    public StageController setTitle(String title) {
        stage.setTitle(title);
        return this;
    }

    public static void closeStage(String _stageName) {
        stages.get(_stageName).close();
        stages.remove(_stageName);
    }

    public static Stage getStage(String _stageName) {
        return stages.get(_stageName);
    }

}


...
Рейтинг: 0 / 0
JavaFX, Stage.setOnCloseRequest
    #38660072
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А как закрытие происходит?
...
Рейтинг: 0 / 0
JavaFX, Stage.setOnCloseRequest
    #38660079
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И на сколько свежая версия Java?
...
Рейтинг: 0 / 0
JavaFX, Stage.setOnCloseRequest
    #38660104
korshun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Java 8

Возможно в первом посте недостаточно конкретики, извиняюсь.
В Stage1 создаем новую сцену Stage2 и вешаем (вроде-как) на ее закрытие обработчик:

Код: java
1.
2.
3.
4.
5.
6.
7.
StageController
    .createStage("estimateStage", new Stage())
    .setTitle("Смета")
    .setModality(Modality.APPLICATION_MODAL)
    .showStage("estimates/fxml/EstmateFXML.fxml");

StageController.getStage("estimateStage").setOnCloseRequest(e -> System.out.println("sdfsdf")); //Не срабатывает!



Stage2 закрывается кастомной кнопкой, на клик по которой привязано закрытие:
Код: java
1.
closeButton.setOnMouseClicked(mouseEvent -> StageController.closeStage("estimateStage"));



Собсно вот..
...
Рейтинг: 0 / 0
JavaFX, Stage.setOnCloseRequest
    #38660136
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Походуй это какой-то косяк в дизайне API. Не бага.
Stage.close() это тоже самое что Window.hide(), которые соответсвенно влияют на свойство Window.showing (onShowing/onHiding)
Window.onCloseRequest это перехват внешнего запроса на закрытие.
Криво. Путанно. Но, как есть.
...
Рейтинг: 0 / 0
JavaFX, Stage.setOnCloseRequest
    #38660184
korshun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Имеете в виду, что в коде у меня что-то "мешает" биндингу ?

Нижеприведенный код так же не работает.. Ерунда какая-то :(

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
package javafxapplication24;

import java.util.logging.Level;
import java.util.logging.Logger;
import javafx.application.Application;
import static javafx.application.Application.launch;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.layout.VBox;
import javafx.scene.text.Font;
import javafx.scene.text.Text;
import javafx.stage.Stage;
import javafx.stage.WindowEvent;

public class JavaFXApplication24 extends Application {

    @Override
    public void start(Stage stage) {
        Text text = new Text("!");
        text.setFont(new Font(40));
        VBox box = new VBox();
        box.getChildren().add(text);
        final Scene scene = new Scene(box,300, 250);
        scene.setFill(null);
        stage.setScene(scene);
        stage.show();
        stage.setOnCloseRequest((WindowEvent we) -> {
            System.out.println("Stage is closing");
        });

        try {
            Thread.sleep(2000);
        } catch (InterruptedException ex) {
            Logger.getLogger(JavaFXApplication24.class.getName()).log(Level.SEVERE,null,ex);
        }
        stage.close();

    }

    public static void main(String[] args) {
        launch(args);
    }
}
...
Рейтинг: 0 / 0
JavaFX, Stage.setOnCloseRequest
    #38660200
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
korshunИмеете в виду, что в коде у меня что-то "мешает" биндингу ?
Нет. Под "связью" я обычно подразумеваю логическую связь в коде, а не ваш биндинг.
Stage.close() -> Window.hide() -> Window.showing = false
onCloseRequest в этой ветке исполнения не наблюдается.

korshunНижеприведенный код так же не работает.. Ерунда какая-то :(

У вас небольшая путаница в понимании. Это не удивительно API так реализован.
Давайте обратим внимание на такой момент.
У класса Window нет метода close(). Но есть свойства хэндлер onCloseRequest. Этот хэндлер к Stage.close() никакого отношения не имеет. Так понятно?
...
Рейтинг: 0 / 0
JavaFX, Stage.setOnCloseRequest
    #38660431
korshun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это понятно, да.
В принципе, это было понятно уже некоторое время назад, т.к. играясь я заметил, что если закрывать окно стандартным крестиком в правом верхнем углу, то onCloseRequest работает на ура. Сейчас вы просто, если можно так сказать, по полочкам разложили этот момент, благодарю.
А как тогда быть со Stage.close(), как ловить это событие, какие есть варианты решения этой проблемы ?
...
Рейтинг: 0 / 0
JavaFX, Stage.setOnCloseRequest
    #38660447
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
korshunА как тогда быть со Stage.close(), как ловить это событие, какие есть варианты решения этой проблемы ?
Например, так:
http://docs.oracle.com/javafx/2/api/javafx/stage/Window.html#onHidingProperty
...
Рейтинг: 0 / 0
JavaFX, Stage.setOnCloseRequest
    #38660461
korshun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо!
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / JavaFX, Stage.setOnCloseRequest
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]