有条件彩色背景JavaFX线形图
我希望有条件地更改折线图的背景色。在给定的示例中,我希望修改图表,以使Y值>=3的任何部分在背景中显示为红色阴影: LineChartJavaFXTest.java有条件彩色背景JavaFX线形图,java,css,javafx,Java,Css,Javafx,我希望有条件地更改折线图的背景色。在给定的示例中,我希望修改图表,以使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.
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);
}
}
结果
这个答案的灵感来自于解决问题的方法。我建议你先检查一下 这个答案包括一个红色渐变,因为这是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();
}
}
导入javafx.application.application;
导入javafx.collections.FXCollections;
导入javafx.collections.ObservableList;
导入javafx.scene.scene;
导入javafx.scene.chart.LineChart;
导入javafx.scene.chart.NumberAxis;
导入javafx.scene.chart.XYChart;
导入javafx.scene.paint.Color;
导入javafx.scene.paint.CycleMethod;
导入javafx.scene.paint.LinearGradient;
导入javafx.scene.paint.Stop;
导入javafx.scene.shape.Polygon;
导入javafx.stage.stage;
公共类LineChartJavaFXTest扩展了应用程序{
公共静态void main(字符串[]args){
发射(args);
}
@凌驾
公众假期开始(阶段){
阶段。设置标题(“折线图样本”);
//定义轴
最终数字axis xAxis=新数字axis();
最终数字axis yAxis=新数字axis();
xAxis.setLabel(“秒”);
yAxis.setLabel(“卷”);
//定义系列
XYChart.Series系列=新的XYChart.Series();
//用数据填充序列
series.getData().add(新的XYChart.Data(1,0));
series.getData().add(新的XYChart.Data(2,1));
series.getData().add(新的XYChart.Data(3,2));
series.getData().add(新的XYChart.Data(4,2));
series.getData().add(新的XYChart.Data(5,1));
series.getData().add(新的XYChart.Data(6,2));
series.getData().add(新的XYChart.Data(7,3));
series.getData().add(新的XYChart.Data(8,3));
series.getData().add(新的XYChart.Data(9,4));
series.getData().add(新的XYChart.Data(10,3));
series.getData().add(新的XYChart.Data(11,2));
series.getData().add(新的XYChart.Data(12,1));
//创建图表
最终线形图线形图=
新折线图(xAxis、yAxis、FXCollections.observableArrayList(系列)){
@凌驾
受保护的无效layoutPlotChildren(){
super.layoutPlotChildren();
Series Series=(Series)getData().get(0);
ObservableList listOfData=series.getData();
对于(int i=0;i=3
if(listOfData.get(i).getYValue().doubleValue()>=3&&
listOfData.get(i+1).getYValue().doubleValue()>=3){
double x1=getXAxis().getDisplayPosition(listOfData.get(i).getXValue());
双y1=getYAxis().getDisplayPosition(0);
double x2=getXAxis().getDisplayPosition(listOfData.get((i+1)).getXValue());
双y2=getYAxis().getDisplayPosition(0);
多边形=新多边形();
LinearGradient linearGrad=新的LinearGradient(0,0,0,1,
正确,//成比例
CycleMethod.NO\u CYCLE,//循环颜色
新站点(0.1f,Color.rgb(255,0,0,3));
polygon.getPoints().addAll(新的双精度[]{
x1,y1,
x1,getYAxis().getDisplayPosition(listOfData.get(i).getYValue()),
x2,getYAxis().getDisplayPosition(listOfData.get((i+1)).getYValue()),
x2,y2
});
getPlotChildren().add(多边形);
多边形。toFront();
多边形.setFill(linearGrad);
}
}
}
};
线形图。设置标题(“测试图”);
场景=新场景(线条图,800600);
scene.getStylesheets().add(“LineChart.css”);
lineChart.applyCss();
舞台场景;
stage.show();
}
}
完美地回答了这个问题(我想要覆盖布局-绘图子项)。当我发布我的问题时,没有看到其他问题。谢谢。当我调整窗口大小时,我看到奇怪的渲染工件。@Holger,请发布一个新问题。但我的评论只与提供的解决方案有关。有关示例屏幕截图,请参见
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();
}
}