Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / JavaFX, Stage.setOnCloseRequest / 10 сообщений из 10, страница 1 из 1
03.06.2014, 14:08
    #38660067
korshun
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JavaFX, Stage.setOnCloseRequest
Добрый день.
Нужно выполнять некие действия при закрытии 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
03.06.2014, 14:09
    #38660072
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JavaFX, Stage.setOnCloseRequest
А как закрытие происходит?
...
Рейтинг: 0 / 0
03.06.2014, 14:11
    #38660079
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JavaFX, Stage.setOnCloseRequest
И на сколько свежая версия Java?
...
Рейтинг: 0 / 0
03.06.2014, 14:22
    #38660104
korshun
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JavaFX, Stage.setOnCloseRequest
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
03.06.2014, 14:38
    #38660136
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JavaFX, Stage.setOnCloseRequest
Походуй это какой-то косяк в дизайне API. Не бага.
Stage.close() это тоже самое что Window.hide(), которые соответсвенно влияют на свойство Window.showing (onShowing/onHiding)
Window.onCloseRequest это перехват внешнего запроса на закрытие.
Криво. Путанно. Но, как есть.
...
Рейтинг: 0 / 0
03.06.2014, 14:59
    #38660184
korshun
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JavaFX, Stage.setOnCloseRequest
Имеете в виду, что в коде у меня что-то "мешает" биндингу ?

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

Код: 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
03.06.2014, 15:05
    #38660200
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JavaFX, Stage.setOnCloseRequest
korshunИмеете в виду, что в коде у меня что-то "мешает" биндингу ?
Нет. Под "связью" я обычно подразумеваю логическую связь в коде, а не ваш биндинг.
Stage.close() -> Window.hide() -> Window.showing = false
onCloseRequest в этой ветке исполнения не наблюдается.

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

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


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