powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / javafx Как повесить листенер на изменение размера окна?
2 сообщений из 2, страница 1 из 1
javafx Как повесить листенер на изменение размера окна?
    #39299919
Maxifly
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Цель моя такая - определять, что ресайзится окно и ресайзить то что в нем отображается.

1. Я правильно понимаю, что Scene всегда имеет размер окна?

2. Как мне повесить листенер на изменение размера Scene?
Дело в том, что если я вешаю листенер в момент инициализации контроллера root, то приложение виснет и окно не рисует

делаю вот так:

FXML:

Код: java
1.
2.
3.
4.
5.
6.
<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.layout.BorderPane?>


<BorderPane fx:id="root" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8.0.60" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.maxifly.GUI.Controllers.Ctrl_Root" />




Контроллер:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
public class Ctrl_Root implements Initializable{
 @FXML
    BorderPane root;

    @Override
    public void initialize(URL location, ResourceBundle resources) {
        root.getScene().widthProperty().addListener(
                new ChangeListener<Number>() {
                    @Override
                    public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) {
//                        System.out.println("with " + newValue);
                    }
                }

        );


    }
}




Создаю Scene так:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
        FXMLLoader loader = new FXMLLoader();
        loader.setLocation(Factory_GUI.class.getResource("Root.fxml"));
        loader.setControllerFactory(new Callback<Class<?>, Object>() {
            @Override
            public Object call(Class<?> aClass) {
                return new Ctrl_Root();
            }
        });

        BorderPane root = loader.load();
        root.setCenter(this.createCertainAction());
        HBox statusBar = this.getStatusBar();
        root.setBottom(statusBar);
        root.setAlignment(statusBar, Pos.BOTTOM_RIGHT);
        root.setTop(this.createMainMenu());


        Scene scene = new Scene(root, 400, 250);




Люблю галеры - работящий коллектив, романтика мужского труда. Стоишь на мостике в пене брызг и эдак поворотясь:
- Голубчик! Утроить количество ударов - Али-паша уходит...
...
Рейтинг: 0 / 0
javafx Как повесить листенер на изменение размера окна?
    #39299923
Maxifly
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxifly,

Отвечу сам себе.
Ошибка происходит из-за того, что на момент инициализации root и scene еще не связаны между собой.

Надо в Ctrl_Root сделать отдельный метод, который ставит листенеры, и вызывать его после
Scene scene = new Scene(root, 400, 250);
Примерно так:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
BorderPane root = loader.load();

        root.setCenter(this.createCertainAction());
        HBox statusBar = this.getStatusBar();
        root.setBottom(statusBar);
        root.setAlignment(statusBar, Pos.BOTTOM_RIGHT);
        root.setTop(this.createMainMenu());


        Scene scene = new Scene(root, 400, 250);
        Ctrl_Root ctrl_root = loader.getController();
        ctrl_root.setListeners();
...
Рейтинг: 0 / 0
2 сообщений из 2, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / javafx Как повесить листенер на изменение размера окна?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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