1

我有一个扩展 BorderPane 的自定义节点:

package main.resources.nodes;

import ...

public class DragNode extends BorderPane {

    public DragNode () {

        setNodes();

        FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("/main/resources/fxml/DragNode.fxml"));
        fxmlLoader.setController(this);
        fxmlLoader.setRoot(this);

        try {
            fxmlLoader.load();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private void setNodes() {

        Circle inpNode = new Circle();
        this.getChildren().add(inpNode);

        inpNode.setRadius(10.0);
        inpNode.setCenterX(this.getBoundsInParent().getMaxX());
        inpNode.setCenterY(this.getBoundsInParent().getMaxY() / 2.0);

        System.out.println(this.getBoundsInParent());   // Prints 'BoundingBox [minX:0.0, minY:-5.0, ... ]'
        System.out.println(this.getParent());           // Prints null
        System.out.println(this.getChildren());         // Prints 1
    }
}

我想在 DragNode的右中边缘创建一个圆圈——即 BorderPane 的右中边缘。

当我将圆的位置设置为 this.getBoundsInLocal().getMaxX 或 inpNode.getBoundsInParent().getMaxX 时,它似乎永远不会返回正确的值。

如何获得该类正在扩展的 BorderPane 的宽度?

提前致谢。我希望这个问题是有道理的!

4

1 回答 1

2

推荐的方法是在代码中添加所有Nodes使用SceneBuilder或直接使用fxml而不是。

虽然在这里您必须等待FXMLLoader初始化 fxml 布局,否则您可能会遇到问题:

public class DragNode extends BorderPane implements Initializable{

    public DragNode () {


        FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("/main/resources/fxml/DragNode.fxml"));
        fxmlLoader.setController(this);
        fxmlLoader.setRoot(this);

        try {
            fxmlLoader.load();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void initialize(URL location, ResourceBundle resources) {

      //call it here so you are sure fxml layout has been initialized
      setNodes();

    }

    private void setNodes() {

        Circle inpNode = new Circle();
        this.getChildren().add(inpNode);

        inpNode.setRadius(10.0);
        inpNode.setCenterX(this.getBoundsInParent().getMaxX());
        inpNode.setCenterY(this.getBoundsInParent().getMaxY() / 2.0);

        System.out.println(this.getBoundsInParent());   // Prints 'BoundingBox [minX:0.0, minY:-5.0, ... ]'
        System.out.println(this.getParent());           // Prints null
        System.out.println(this.getChildren());         // Prints 1
    }
}
于 2016-09-23T04:01:43.583 回答