如何使图表内容区域占用可用的最大区域?

非常直截了当的问题: 如何使图表内容区域占用最大可用面积?

我正在使用JavaFX。 在我的情况下,我希望有许多基于真/假yAxis (0/1)的yAxis 。 遗憾的是,我无法找到如何使用yAxis或AreaChart对象上的setMaxHeight或setPrefHeight等方法更改这些图表的内容高度的解决方案。

我已经尝试过几个来自SO的答案,但没有一个有效。

这是我到目前为止的截图:

在此处输入图像描述

任何提示或提示?

重述的问题

你的问题有点不清楚,但我认为你要问的是:

如何使图表内容区域占用可用的最大区域?

也许不是这样,但无论如何这是我在这里回答的问题。

样本输出

这是一个小图表的屏幕截图:

小图表

该图表包含删除内容周围的所有轴,图例,标题和填充。 这允许图表内容占用所有可用空间,从而可以显示非常小的图表。 默认情况下,填充标题和轴显示将占用足够的空间,使得图表内容本身对于非常小的图表变得难以辨认。

示例代码

在下面的代码中,很多东西的可见性设置为false,并且轴的首选大小设置为0:

 import javafx.application.Application; import javafx.scene.Scene; import javafx.scene.chart.*; import javafx.stage.Stage; import java.net.MalformedURLException; import java.net.URISyntaxException; public class AreaChartSample extends Application { @Override public void start(Stage stage) throws URISyntaxException, MalformedURLException { stage.setTitle("Area Chart Sample"); final NumberAxis xAxis = new NumberAxis(1, 31, 1); final NumberAxis yAxis = new NumberAxis(0, 28, 1); xAxis.setAutoRanging(false); xAxis.setMinorTickVisible(false); xAxis.setTickMarkVisible(false); xAxis.setTickLabelsVisible(false); xAxis.setPrefSize(0, 0); yAxis.setAutoRanging(false); yAxis.setMinorTickVisible(false); yAxis.setTickMarkVisible(false); yAxis.setTickLabelsVisible(false); yAxis.setPrefSize(0, 0); final AreaChart ac = new AreaChart<>(xAxis,yAxis); ac.setHorizontalGridLinesVisible(false); ac.setVerticalGridLinesVisible(false); ac.setLegendVisible(false); ac.setVerticalZeroLineVisible(false); ac.setHorizontalZeroLineVisible(false); ac.getStylesheets().add( getClass().getResource("unpad-chart.css").toURI().toURL().toExternalForm() ); XYChart.Series seriesApril= new XYChart.Series(); seriesApril.setName("April"); seriesApril.getData().add(new XYChart.Data(1, 4)); seriesApril.getData().add(new XYChart.Data(3, 10)); seriesApril.getData().add(new XYChart.Data(6, 15)); seriesApril.getData().add(new XYChart.Data(9, 8)); seriesApril.getData().add(new XYChart.Data(12, 5)); seriesApril.getData().add(new XYChart.Data(15, 18)); seriesApril.getData().add(new XYChart.Data(18, 15)); seriesApril.getData().add(new XYChart.Data(21, 13)); seriesApril.getData().add(new XYChart.Data(24, 19)); seriesApril.getData().add(new XYChart.Data(27, 21)); seriesApril.getData().add(new XYChart.Data(30, 21)); seriesApril.getData().add(new XYChart.Data(31, 19)); XYChart.Series seriesMay = new XYChart.Series(); seriesMay.setName("May"); seriesMay.getData().add(new XYChart.Data(1, 20)); seriesMay.getData().add(new XYChart.Data(3, 15)); seriesMay.getData().add(new XYChart.Data(6, 13)); seriesMay.getData().add(new XYChart.Data(9, 12)); seriesMay.getData().add(new XYChart.Data(12, 14)); seriesMay.getData().add(new XYChart.Data(15, 18)); seriesMay.getData().add(new XYChart.Data(18, 25)); seriesMay.getData().add(new XYChart.Data(21, 25)); seriesMay.getData().add(new XYChart.Data(24, 23)); seriesMay.getData().add(new XYChart.Data(27, 26)); seriesMay.getData().add(new XYChart.Data(31, 26)); Scene scene = new Scene(ac,80,60); ac.getData().addAll(seriesApril, seriesMay); stage.setScene(scene); stage.show(); } public static void main(String[] args) { launch(args); } } 

此外,一些CSS删除填充。 将CSS文件放在与AreaChartSample.java相同的位置,让构建系统将其复制到构建目标目录。

unpad-chart.css

 .chart { -fx-padding: 0px; } .chart-content { -fx-padding: 0px; } .axis { AXIS_COLOR: transparent; } .axis:top > .axis-label, .axis:left > .axis-label { -fx-padding: 0; } .axis:bottom > .axis-label, .axis:right > .axis-label { -fx-padding: 0; } 

布局调试建议

  • 要调试布局问题,请使用ScenicView 。
  • 要确定要覆盖的默认CSS样式,请查看modena.css
    • 对于Java 8, modena.css位于JRE附带的jfxrt.jar文件中。