JavaFX:将属性绑定到窗格时遇到问题

时间:2016-06-14 08:18:02

标签: java javafx

我是刚刚开始学习JavaFX的初学者,我似乎在我的程序中犯了同样的错误。例如,在下面的代码中,我试图绘制X轴和Y轴,并将其绑定到窗格宽度和高度的一半。执行时,轴非常小,位于topleft角,但是当您调整应用程序窗口的大小时,轴的大小会逐渐增大,直到窗口不再调整大小为止。

public class Debug extends Application {
    @Override
    public void start(Stage primaryStage) {
        Pane pane = new Pane();
        GraphFunc test = new GraphFunc();
        pane.getChildren().add(test);

        Scene scene = new Scene(pane, 500, 500);
        primaryStage.setScene(scene);
        primaryStage.show();
    }
    public static void main(String[] args) {
        launch(args);
    }
}

class GraphFunc extends Pane {
    private double xAxisSpan, yAxisSpan;

    public GraphFunc() {
        xAxisSpan = 100;
        yAxisSpan = 100;
        drawAxes();
    }

    private void drawAxes() {
        Line xAxis = new Line(0, 50, 100, 50);
        Line yAxis = new Line(50, 0, 50, 100);
        xAxis.setStartX(0);
        xAxis.startYProperty().bind(heightProperty().divide(2));
        xAxis.endXProperty().bind(widthProperty());
        xAxis.endYProperty().bind(heightProperty().divide(2));

        yAxis.startXProperty().bind(widthProperty().divide(2));
        yAxis.setStartY(0);
        yAxis.endXProperty().bind(widthProperty().divide(2));
        yAxis.endYProperty().bind(heightProperty());

        getChildren().addAll(xAxis, yAxis);
    }
}

我很困惑,因为当窗格更改为StackPane时,不会发生这种情况。此外,如果我将drawAxes()中的代码移动到start()并将行添加到窗格,它也不会这样做。请解释一下,在研究和玩弄它之后,我似乎无法理解发生了什么。

1 个答案:

答案 0 :(得分:1)

这是因为Pane发生的。当需要对儿童进行绝对定位时,需要使用窗格。

这是来自Oracle文档:

  

这个类可以直接用于需要儿童绝对定位的情况,因为除了将可调整大小的孩子调整到他们喜欢的大小之外,它不会执行布局。由于窗格在布局期间单独留下位置,因此应用程序负责定位子项。

    Pane pane = new Pane();
    GraphFunc test = new GraphFunc();
    pane.getChildren().add(test);

    Scene scene = new Scene(pane, 500, 500);

如果从场景中移除宽度和高度,而是直接设置宽度和高度,则测试如下:



    public void start(Stage primaryStage) {
        GridPane pane = new GridPane();
        GraphFunc test = new GraphFunc();
        test.setPrefSize(500, 500);
        pane.getChildren().add(test);

        Scene scene = new Scene(pane);
        primaryStage.setScene(scene);
        primaryStage.show();
    }




你会得到这个:

drawn image

但是你无法跨越。

来自Oracle文档:

  

注意:如果某个应用程序需要将子项保持对齐   父(中心,位于左上角等),它应该使用a   反而是StackPane。

同样来自Oracle文档:

  

Pane默认情况下不剪辑其内容,因此有可能   儿童'如果,边界可能超出其自身界限   将子项置于负坐标或调整窗格大小   小于其首选尺寸。