Javafx 限制条形图的宽度和大小
我创建了一个简单的条形图示例,但我注意到条形图的大小与图表相符。如何限制尺寸?例如,我想限制宽度大小 正如我们已经讨论过的,要在每个条上设置最大宽度,我们必须在每次调整场景或图表的大小时相应地更改barGap或categoryGap 与参考问题的唯一区别是,我们必须在第一次显示图表时调整其大小 基于相同的代码,让我们创建setMaxBarWidth方法: 编辑Javafx 限制条形图的宽度和大小,javafx,javafx-2,javafx-8,Javafx,Javafx 2,Javafx 8,我创建了一个简单的条形图示例,但我注意到条形图的大小与图表相符。如何限制尺寸?例如,我想限制宽度大小 正如我们已经讨论过的,要在每个条上设置最大宽度,我们必须在每次调整场景或图表的大小时相应地更改barGap或categoryGap 与参考问题的唯一区别是,我们必须在第一次显示图表时调整其大小 基于相同的代码,让我们创建setMaxBarWidth方法: 编辑 我已经用Platform.runLater包装了对setMaxBarWidth的调用,因此场景图有时间正确刷新图表,避免在while循环
我已经用Platform.runLater包装了对setMaxBarWidth的调用,因此场景图有时间正确刷新图表,避免在while循环期间进行多次重新绘制。此外,我已将侦听器移动到bc.widthProperty,以防图表嵌入到其他容器中。您的示例很好,但我需要描述一个小问题。我有一个拆分窗格,其中有一个用于保存图表的VBox。每次考试我都有旧的结果。但是当我拖动SplitPane时,我得到了想要的结果。看起来宽度计算不正确。你知道我如何在第一次加载时做到这一点吗?你需要倾听VBox宽度的变化,因此每次调整其大小时,条形图宽度也会重新计算。我测试过完全删除VBox并直接将图表插入SplitPane,但仍然没有解决方案。请检查我的编辑,现在,它应该在SplitPane中的VBox中工作。根据javadoc:runLater,在将来某个未指定的时间在JavaFX应用程序线程上运行指定的Runnable。这样可以避免多次重新绘制图表。
private final NumberAxis yAxis = new NumberAxis();
private final CategoryAxis xAxis = new CategoryAxis();
private final BarChart<String,Number> bc = new BarChart<>(xAxis,yAxis);
private void setMaxBarWidth(double maxBarWidth, double minCategoryGap){
double barWidth=0;
do{
double catSpace = xAxis.getCategorySpacing();
double avilableBarSpace = catSpace - (bc.getCategoryGap() + bc.getBarGap());
barWidth = (avilableBarSpace / bc.getData().size()) - bc.getBarGap();
if (barWidth >maxBarWidth){
avilableBarSpace=(maxBarWidth + bc.getBarGap())* bc.getData().size();
bc.setCategoryGap(catSpace-avilableBarSpace-bc.getBarGap());
}
} while(barWidth>maxBarWidth);
do{
double catSpace = xAxis.getCategorySpacing();
double avilableBarSpace = catSpace - (minCategoryGap + bc.getBarGap());
barWidth = Math.min(maxBarWidth, (avilableBarSpace / bc.getData().size()) - bc.getBarGap());
avilableBarSpace=(barWidth + bc.getBarGap())* bc.getData().size();
bc.setCategoryGap(catSpace-avilableBarSpace-bc.getBarGap());
} while(barWidth < maxBarWidth && bc.getCategoryGap()>minCategoryGap);
}
@Override
public void start(Stage stage) {
bc.setTitle("1");
xAxis.setLabel("Groups");
yAxis.setLabel("Value");
XYChart.Series series1 = new XYChart.Series();
series1.setName("Groups");
series1.getData().add(new XYChart.Data("kk", 1));
Scene scene = new Scene(bc,800,600);
bc.getData().addAll(series1);
stage.setScene(scene);
stage.show();
setMaxBarWidth(40, 10);
bc.widthProperty().addListener((obs,b,b1)->{
Platform.runLater(()->setMaxBarWidth(40, 10));
});
}