【问题标题】:Conditionally Color Background JavaFX LineChart有条件地为背景着色 JavaFX LineChart
【发布时间】:2015-12-14 21:16:46
【问题描述】:

我希望有条件地更改折线图的背景颜色。在给定的示例中,我希望修改图表,以便 Y 值 >=3 的任何部分在背景中显示为红色:

LineChartJavaFXTest.java

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.chart.LineChart;
import javafx.scene.chart.NumberAxis;
import javafx.scene.chart.XYChart;
import javafx.stage.Stage;


public class LineChartJavaFXTest extends Application {

    @Override public void start(Stage stage) {
        stage.setTitle("Line Chart Sample");
        //defining the axes
        final NumberAxis xAxis = new NumberAxis();
        final NumberAxis yAxis = new NumberAxis();
        xAxis.setLabel("Seconds");
        yAxis.setLabel("Volume");
        //creating the chart
        final LineChart<Number,Number> lineChart = 
                new LineChart<Number,Number>(xAxis,yAxis);

        lineChart.setTitle("Test Chart");
        //defining a series
        XYChart.Series series = new XYChart.Series();
        //populating the series with data
        series.getData().add(new XYChart.Data(1, 0));
        series.getData().add(new XYChart.Data(2, 1));
        series.getData().add(new XYChart.Data(3, 2));
        series.getData().add(new XYChart.Data(4, 2));
        series.getData().add(new XYChart.Data(5, 1));
        series.getData().add(new XYChart.Data(6, 2));
        series.getData().add(new XYChart.Data(7, 3));
        series.getData().add(new XYChart.Data(8, 3));
        series.getData().add(new XYChart.Data(9, 4));
        series.getData().add(new XYChart.Data(10, 3));
        series.getData().add(new XYChart.Data(11, 2));
        series.getData().add(new XYChart.Data(12, 1));

        Scene scene  = new Scene(lineChart,800,600);
        scene.getStylesheets().add("LineChart.css");
        lineChart.getData().add(series);
        lineChart.applyCss();

        stage.setScene(scene);
        stage.show();
    }

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

LineChart.css

.chart {
    -fx-padding: 10px;
    -fx-background-color: #010101;
    -fx-legend-visible: false;
}

.chart-content {
    -fx-padding: 30px;    
}

.chart-title {
    -fx-text-fill: #ffffff;
    -fx-font-size: 1.6em;
}

.axis-label {
    -fx-text-fill: #ffffff;
}

.chart-plot-background {
    -fx-background-color:transparent;
}

.chart-vertical-grid-lines {
    -fx-stroke:#505050;
}

.chart-horizontal-grid-lines {
    -fx-stroke: #505050;
}

.chart-alternative-row-fill {
    -fx-fill:transparent;
    -fx-stroke: transparent;
}

.default-color0.chart-series-line {
    -fx-stroke: #0000ff;
}

.default-color0.chart-line-symbol {
    -fx-background-color: #0000ff, white;
}

结果

【问题讨论】:

    标签: java css javafx


    【解决方案1】:

    这个答案的灵感来自JavaFX Linechart Color differences 的解决方案。我建议你先完成它。

    这个答案包括一个单一的红色渐变,因为这是 OP 想要的。

    解决方案

    import javafx.application.Application;
    import javafx.collections.FXCollections;
    import javafx.collections.ObservableList;
    import javafx.scene.Scene;
    import javafx.scene.chart.LineChart;
    import javafx.scene.chart.NumberAxis;
    import javafx.scene.chart.XYChart;
    import javafx.scene.paint.Color;
    import javafx.scene.paint.CycleMethod;
    import javafx.scene.paint.LinearGradient;
    import javafx.scene.paint.Stop;
    import javafx.scene.shape.Polygon;
    import javafx.stage.Stage;
    
    
    public class LineChartJavaFXTest extends Application {
    
        public static void main(String[] args) {
            launch(args);
        }
    
        @Override
        public void start(Stage stage) {
            stage.setTitle("Line Chart Sample");
            //defining the axes
            final NumberAxis xAxis = new NumberAxis();
            final NumberAxis yAxis = new NumberAxis();
            xAxis.setLabel("Seconds");
            yAxis.setLabel("Volume");
    
    
            //defining a series
            XYChart.Series series = new XYChart.Series();
            //populating the series with data
    
            series.getData().add(new XYChart.Data(1, 0));
            series.getData().add(new XYChart.Data(2, 1));
            series.getData().add(new XYChart.Data(3, 2));
            series.getData().add(new XYChart.Data(4, 2));
            series.getData().add(new XYChart.Data(5, 1));
            series.getData().add(new XYChart.Data(6, 2));
            series.getData().add(new XYChart.Data(7, 3));
            series.getData().add(new XYChart.Data(8, 3));
            series.getData().add(new XYChart.Data(9, 4));
            series.getData().add(new XYChart.Data(10, 3));
            series.getData().add(new XYChart.Data(11, 2));
            series.getData().add(new XYChart.Data(12, 1));
    
    
            //creating the chart
            final LineChart<Number, Number> lineChart = 
                 new LineChart<Number, Number>(xAxis, yAxis, FXCollections.observableArrayList(series)) {
                @Override
                protected void layoutPlotChildren() {
                    super.layoutPlotChildren();
                    Series series =  (Series) getData().get(0);
                    ObservableList<Data<Number,Number>> listOfData = series.getData();
    
                    for(int i = 0; i < listOfData.size()-1; i++) {
                        // Check for Y value >=3
                        if(listOfData.get(i).getYValue().doubleValue() >= 3 &&
                                listOfData.get(i+1).getYValue().doubleValue() >= 3) {
                            double x1 = getXAxis().getDisplayPosition(listOfData.get(i).getXValue());
                            double y1 = getYAxis().getDisplayPosition(0);
                            double x2 = getXAxis().getDisplayPosition(listOfData.get((i + 1)).getXValue());
                            double y2 = getYAxis().getDisplayPosition(0);
                            Polygon polygon = new Polygon();
                            LinearGradient linearGrad = new LinearGradient( 0, 0, 0, 1,
                                    true, // proportional
                                    CycleMethod.NO_CYCLE, // cycle colors
                                    new Stop(0.1f, Color.rgb(255, 0, 0, .3)));
    
                            polygon.getPoints().addAll(new Double[]{
                                    x1,y1,
                                    x1, getYAxis().getDisplayPosition(listOfData.get(i).getYValue()),
                                    x2,getYAxis().getDisplayPosition(listOfData.get((i+1)).getYValue()),
                                    x2,y2
                            });
                            getPlotChildren().add(polygon);
                            polygon.toFront();
                            polygon.setFill(linearGrad);
                        }
                    }
                }
            };
    
            lineChart.setTitle("Test Chart");
    
            Scene scene = new Scene(lineChart, 800, 600);
            scene.getStylesheets().add("LineChart.css");
            lineChart.applyCss();
    
            stage.setScene(scene);
            stage.show();
        }
    }
    

    【讨论】:

    • 完美地回答了这个问题(我想要的是覆盖布局图的孩子)。当我发布我的时没有看到这个其他问题。谢谢。
    • 我在调整窗口大小时看到了奇怪的渲染伪影。
    • @Holger 请发布一个新问题。
    • 但我的评论只与为这个问题提供的解决方案有关。截图示例见i.imgur.com/ydIlI3J.png
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-16
    • 1970-01-01
    相关资源
    最近更新 更多