JavaFX - StackedAreaChart和方法setLowerBound

时间:2014-10-09 11:17:55

标签: java css eclipse javafx stacked-area-chart

我对Class StackedAreaChart和setLowerBound有一些问题。 当我将autoRangingProperty设置为true时,一切正常

http://i62.tinypic.com/2q0n3ht.png

但是当我关闭autoRanging并设置一些参数时,我会遇到一些错误..

http://i62.tinypic.com/2hdcn6p.png

import java.util.Random;

import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.chart.NumberAxis;
import javafx.scene.chart.StackedAreaChart;
import javafx.scene.chart.XYChart;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

public class TestStackedAreaChart extends Application {

    StackPane mainGraphStackPane = null;
    BorderPane pane;

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

    @Override
    public void start(Stage stage) {
        // /
        Random generator = new Random();

        XYChart.Series<Number, Number> series1 = new XYChart.Series<>(); // line
        XYChart.Series<Number, Number> series2 = new XYChart.Series<>(); // down
        XYChart.Series<Number, Number> series3 = new XYChart.Series<>(); // up
        for (int i = 1; i < 50; i++) {
            Double value = generator.nextDouble() + 1;
            series1.getData().add(new XYChart.Data<Number, Number>(i, value));
            Double Ymin = value - generator.nextDouble() * 0.2;
            series2.getData().add(new XYChart.Data<Number, Number>(i, Ymin));
            Double Ymax = (value - Ymin) + generator.nextDouble() * 0.2;
            series3.getData().add(new XYChart.Data<Number, Number>(i, Ymax));

        }
        // /

        final NumberAxis xAxisLC = new NumberAxis();
        final NumberAxis yAxisLC = new NumberAxis();
        /////////what's wrong
        yAxisLC.autoRangingProperty().set(false);
        yAxisLC.setMinorTickLength(yAxisLC.getTickLength());
        yAxisLC.setMinorTickCount(0);
        yAxisLC.setUpperBound(2.5);
        yAxisLC.setLowerBound(1.0); //when I set 0.0 is OK
        yAxisLC.setTickUnit(0.2);
        ///////
        pane = new BorderPane();
        mainGraphStackPane = new StackPane();
        mainGraphStackPane.getChildren().add(pane);

        StackedAreaChart<Number, Number> areaChart = new StackedAreaChart<Number, Number>(
                xAxisLC, yAxisLC);
        areaChart.setCreateSymbols(false);
        areaChart.setAlternativeRowFillVisible(false);
        areaChart.setAnimated(false);
        areaChart.setLegendVisible(false);
        areaChart.getData().add(series2);
        areaChart.getData().add(series3);

        Scene scene = new Scene(mainGraphStackPane);
        mainGraphStackPane.getChildren().add(areaChart);
        mainGraphStackPane.getStylesheets().add("chart.css");
        stage.setScene(scene);
        Group root = new Group();
        pane.getChildren().add(root);
        stage.show();
        stage.setWidth(stage.getWidth() + 1);
        stage.setHeight(stage.getHeight() + 1);

    }
}

和CSS文件

@CHARSET "UTF-8";
.default-color0.chart-area-symbol { -fx-background-color: #e9967a, #ffa07a; }
.default-color1.chart-area-symbol { -fx-background-color: #e9967a, #ffa07a; }

.default-color0.chart-series-area-line { -fx-stroke: #ffaa00; }
.default-color1.chart-series-area-line { -fx-stroke: #ffaa00; }

.default-color0.chart-series-area-fill { -fx-fill: #ffff0055; }
.default-color1.chart-series-area-fill { -fx-fill: #ffaa005

谁有想法解决它。

2 个答案:

答案 0 :(得分:1)

我在StackedAreaChart中遇到了类似的问题,在将它们添加到图表之前我必须有效地抵消所有值,以便图表实际上从零开始,然后将y轴标签调整为正确。

  1. setAutoRanging(false);
  2. setForceZeroInRange(false);
  3. 计算出您要添加到图表中的值的范围,存储最大值和最小值。
  4. 添加减去最小值的所有值。
  5. setLowerBound(0);
  6. setUpperBound(...);到最大值减去最小值。
  7. 在y轴上
  8. setTickLabelFormatter,在StringConverter<Number> toString方法中,在格式化之前将最小值添加到该值。
  9. e.g。你有一个3到10范围内的数据加载。你将它们添加到图表中的范围是0到7.并且0的y轴标签将调整为3,1调整为4,等等。

    我的图表非常复杂,但如果我有时间将其简化,我会发布一些示例代码,但上面的代码应该足够了。

答案 1 :(得分:0)

http://oi60.tinypic.com/21ah3b5.jpg

我想一想,我如何放大这张图表。 在Linechart类中工作正常:)