在GridPane中间隔JavaFX LineCharts

时间:2017-02-13 20:47:07

标签: java javafx parent gridpane sizing

现在我正在尝试编写一个用于在JavaFX LineCharts中显示数据的程序。我的主面板是一个BorderPane,在顶部/左/右/等处有一些功能..在面板的中心我想显示LineChart(s)。至少1,最多4。

所以我考虑将网格窗格设置到主面板的中心,以达到类似的结果:

Sample Gridpane

我现在的问题是,当我尝试将LineCharts添加到GridPane时(使用.add(图表,0,0)),图表与父级不匹配。如果我继续添加更多图表,则相同。出类似的事情:

Something like this

我在父母匹配上查了很多东西,但不知何故我没有到达任何地方:/我需要知道边框的“中心”的大小,然后我可以相应地调整LineCharts的大小。但我找不到......也许你们中的某个人有线索?

干杯!

1 个答案:

答案 0 :(得分:0)

您可以向GridPane添加一个侦听器,其大小与子元素一样,并根据子元素列表的大小更新子节点的布局约束。

charts

import javafx.application.Application;
import javafx.beans.binding.Bindings;
import javafx.collections.ObservableList;
import javafx.geometry.*;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.chart.*;
import javafx.scene.layout.*;
import javafx.stage.Stage;

import java.util.stream.IntStream;

public class GridViewer extends Application {
    @Override
    public void start(final Stage stage) throws Exception {
        ChartGrid grid = new ChartGrid();

        grid.getChildren().setAll(
                IntStream.range(1, 5)
                        .mapToObj(this::createLineChart)
                        .toArray(Chart[]::new)
        );

        stage.setScene(new Scene(grid));
        stage.show();
    }

    class ChartGrid extends GridPane {
        ChartGrid() {
            setHgap(5);
            setVgap(5);
            setPadding(new Insets(5));

            setPrefSize(500, 500);

            Bindings.size(getChildren()).addListener((observable, oldSize, newSize) -> {
                ObservableList<Node> nodes = getChildren();
                for (int i = 0; i < newSize.intValue(); i++) {
                    GridPane.setConstraints(
                            nodes.get(i),
                            i / 2, i % 2,
                            1, 1,
                            HPos.CENTER, VPos.CENTER,
                            Priority.ALWAYS, Priority.ALWAYS
                    );
                }
            });
        }
    }

    private Chart createLineChart(int idx) {
        NumberAxis xAxis = new NumberAxis();
        NumberAxis yAxis = new NumberAxis();
        LineChart<Number, Number> chart = new LineChart<>(xAxis, yAxis);
        chart.setTitle("Chart " + idx);
        chart.setMinSize(0, 0);

        return chart;
    }

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

注意:此解决方案的一个重要部分是将图表的minSize设置为0:

chart.setMinSize(0, 0);

这是因为如果你将GridPane的可用区域的大小设置为小于图表最小大小的总和(默认情况下不是0),那么图表将开始相互重叠绘制,这不是你想要什么。