Как распознать изменение границ узла в сцене? - PullRequest
0 голосов
/ 11 января 2019

Допустим, у меня есть некоторый TextField, который находится глубоко в структуре макета панели. Я хочу добавить слушателя или каким-то образом распознать, что TextField изменил свою позицию (x, y) в сцене. Вопрос в том, как я могу добиться этого надлежащим, многоразовым способом?

Я предоставляю тестовый код. Для воссоздания, пожалуйста, перетащите границу сцены, что приведет к изменению положения TextField.

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.TextField;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Region;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

public class App extends Application {

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage stage) throws Exception {
        TextField textField = new TextField();
        Button button = new Button("Button");

        HBox hBox = new HBox(textField, button);
        hBox.setMaxSize(Region.USE_PREF_SIZE, Region.USE_PREF_SIZE);

        StackPane stackPane = new StackPane(hBox);
        stackPane.setPrefSize(600., 400.);
        Scene scene = new Scene(stackPane);
        stage.setScene(scene);
        stage.show();
    }
}

1 Ответ

0 голосов
/ 11 января 2019

Добавьте слушателя к свойству localToSceneTransform узла.

node.localToSceneTransformProperty().addListener((o, oldValue, newValue) -> {
    System.out.println("transform may have changed");
});

Обратите внимание, что это

  1. Выводит некоторые "ложные срабатывания", то есть может уведомить вас, если позиция фактически не изменилась.
  2. Регистрация слишком большого количества этих прослушивателей на узлах может снизить производительность вашего приложения, поскольку для этого требуется прослушивание изменений для всех узлов в иерархии вплоть до корневого узла.

В дополнение к этому может потребоваться прослушиватель свойства boundsInLocal, если вы также хотите получать уведомления об изменении размера самого узла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...