使用FXML确定JavaFX图表大小

时间:2013-07-31 13:08:28

标签: java charts javafx-2 fxml

我正在为JavaFX 2.2中的折线图制作一个值标记。因此,我在stackoverflow上使用现有问题的答案,谢尔盖格里内夫的例子工作正常。但是,如果我想使用FXML添加图表而不是添加硬编码,我在确定图表背景的大小时会遇到问题。

我将chartvalueMarker的初始化移动到FXMLLoader处理完根元素后自动调用的initialize()方法(请参阅{{3]中的注释}})。但是如果我现在使用以下代码来确定图表背景的大小,则每个绑定值只返回0.0:

Node chartArea = chart.lookup(".chart-plot-background");
Bounds chartAreaBounds = chartArea.localToScene(chartArea.getBoundsInLocal());

updateMarker()方法中的完全相同的代码返回第二次调用时图表背景的确定大小。在第一次调用时,设置了边界,但minX不正确。这是我的代码:

public class LineChartValueMarker extends Application {

    @FXML
    private LineChart<Number, Number> chart;

    @FXML
    private Line valueMarker;

    @FXML
    private NumberAxis yAxis;

    private XYChart.Series<Number, Number> series = new XYChart.Series<>();

    private void updateMarker() {
        Node chartArea = chart.lookup(".chart-plot-background");
        Bounds chartAreaBounds = chartArea.localToScene(chartArea
                .getBoundsInLocal());

        // SIZE OF THE CHART IS DETERMINED
        System.out.println(chartAreaBounds);

        valueMarker.setStartX(chartAreaBounds.getMinX());
        valueMarker.setEndX(chartAreaBounds.getMaxX());
    }

    public void initialize() {
        series.getData().add(new XYChart.Data(0, 0));
        series.getData().add(new XYChart.Data(10, 20));

        chart.getData().addAll(series);

        // add new value on mouseclick for testing
        chart.setOnMouseClicked(new EventHandler<MouseEvent>() {
            @Override
            public void handle(MouseEvent t) {
                series.getData().add(
                        new XYChart.Data(series.getData().size() * 10,
                                30 + 50 * new Random().nextDouble()));
                updateMarker();
            }
        });

        // find chart area Node
        Node chartArea = chart.lookup(".chart-plot-background");
        Bounds chartAreaBounds = chartArea.localToScene(chartArea
                .getBoundsInLocal());

        // SIZE AND POSITION OF THE CHART IS 0.0
        System.out.println(chartAreaBounds);
    }

    @Override
    public void start(Stage stage) throws IOException {
        FXMLLoader loader = new FXMLLoader();

        InputStream in = this.getClass().getResourceAsStream(
                "LineChartValueMarker.fxml");
        loader.setBuilderFactory(new JavaFXBuilderFactory());
        loader.setLocation(this.getClass().getResource(
                "LineChartValueMarker.fxml"));

        Pane pane = (Pane) loader.load(in);
        Scene scene = new Scene(pane);
        stage.setScene(scene);
        stage.show();
    }

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

我在代码中的位置添加了大写注释,我打印了边界(我删除了valueMarker的Y坐标的更新)。这是输出:

BoundingBox [minX:0.0, minY:0.0, minZ:0.0, width:0.0, height:0.0, depth:0.0, maxX:0.0, maxY:0.0, maxZ:0.0]
BoundingBox [minX:45.0, minY:15.0, minZ:0.0, width:441.0, height:318.0, depth:0.0, maxX:486.0, maxY:333.0, maxZ:0.0]
BoundingBox [minX:37.0, minY:15.0, minZ:0.0, width:449.0, height:318.0, depth:0.0, maxX:486.0, maxY:333.0, maxZ:0.0]

第一个输出行来自initialize()方法,第一次调用updateMarker()的第二行(第一次鼠标点击图表)和第二次调用{{1} (在图表上第二次鼠标点击),它最终返回图表背景的正确绑定值。

现在我的问题:如何或何时可以确定图表背景的正确大小(最好采用updateMarker()方法)?我希望有人能提供帮助,因为我对这种行为没有任何解释。谢谢!

0 个答案:

没有答案