如何识别场景中的节点边界变化?

时间:2019-01-11 12:22:34

标签: javafx

让我们说我有一些TextField放置在窗格的布局结构中。我想添加侦听器或以某种方式识别TextField在Scene中的位置(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 :(得分:4)

将侦听器添加到节点的localToSceneTransform property

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

请注意,

  1. 产生一些“误报”,即如果职位实际没有变化,它可能会通知您。
  2. 将太多此类侦听器注册到节点可能会降低应用程序的性能,因为这样做会侦听层次结构中直至根节点的所有节点的更改。

此外,如果您还希望收到有关节点本身大小更改的通知,则可能需要boundsInLocal属性的侦听器。