2

以下程序在嵌入窗格(或锚窗格的边框窗格)时无法水平调整折线图的大小如果折线图直接作为 VBox 的父级,那么一切都按预期工作。

我发现我需要将图表大小绑定到父窗格,我认为这必须由 VBox 和 HBox 自动完成。

在尝试了 HBox/VBox 中不同的封闭组合、设置增长和对齐策略之后,我对布局的工作方式感到非常困惑。我观察到 ui 组件在调整大小时的行为方式存在差异。

任何澄清(或对 javadoc 不清楚的文档的摘要见解)表示赞赏。

此致。

来源编辑和澄清

import javafx.application.Application;
import javafx.scene.*;
import javafx.scene.chart.*;
import javafx.scene.layout.*;
import javafx.stage.Stage;

public class App extends Application {

    @Override
    public void start(Stage stage) {
        NumberAxis xAxis = new NumberAxis();
        NumberAxis yAxis = new NumberAxis();
        xAxis.setLabel("X");
        yAxis.setLabel("Y");

        final LineChart<Number, Number> lineChart = new LineChart<>(xAxis, yAxis);
        lineChart.setTitle("x = f(y)");

        XYChart.Series data = new XYChart.Series();
        data.setName("Serie 1");
        for (int i = 0; i < 10; i++) {
            data.getData().add(new XYChart.Data(i, i * i));
        }
        lineChart.getData().add(data);

        VBox vb = new VBox();
        vb.setFillWidth(true);
        HBox hb = new HBox();
        hb.getChildren().add(lineChart);
        hb.setFillHeight(true);
        vb.getChildren().add(hb);

        HBox.setHgrow(lineChart, Priority.ALWAYS);
        VBox.setVgrow(hb, Priority.ALWAYS);

        Scene scene = new Scene(vb);

        stage.setScene(scene);
        stage.centerOnScreen();
        stage.setResizable(true);
        stage.show();
    }

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

1 回答 1

3

作为记录,在修改此错字后,解决了提供的示例的问题:

HBox.setHgrow(hb, Priority.ALWAYS); 

至:

HBox.setHgrow(lineChart, Priority.ALWAYS); 

这修复了水平调整大小。

当直接嵌入到 VBox 中时,图表的大小会在调整大小时重新计算,因为它锚定在边界发生变化的 VBox 上。当嵌入到 HBox 中时,我们必须为 HBox 提供水平和垂直增长的提示。垂直它是通过以下方式完成的:

VBox.setVgrow(hb, Priority.ALWAYS);

在水平方向上,它是通过请求其内容占据所有可用空间来完成的,上面的修复就是关于这一点的。

于 2013-07-11T11:43:56.617 回答