我是刚刚开始学习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()并将行添加到窗格,它也不会这样做。请解释一下,在研究和玩弄它之后,我似乎无法理解发生了什么。
答案 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();
}

你会得到这个:
但是你无法跨越。
来自Oracle文档:
注意:如果某个应用程序需要将子项保持对齐 父(中心,位于左上角等),它应该使用a 反而是StackPane。
同样来自Oracle文档:
Pane默认情况下不剪辑其内容,因此有可能 儿童'如果,边界可能超出其自身界限 将子项置于负坐标或调整窗格大小 小于其首选尺寸。