Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Creating a Doughnut chart in JavaFX
import javafx.collections.ObservableList;
import javafx.geometry.Bounds;
import javafx.scene.Node;
import javafx.scene.chart.PieChart;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
public class DoughnutChart extends PieChart {
private final Circle innerCircle;
public DoughnutChart(ObservableList<Data> pieData) {
super(pieData);
innerCircle = new Circle();
// just styled in code for demo purposes,
// use a style class instead to style via css.
innerCircle.setFill(Color.WHITESMOKE);
innerCircle.setStroke(Color.WHITE);
innerCircle.setStrokeWidth(3);
}
@Override
protected void layoutChartChildren(double top, double left, double contentWidth, double contentHeight) {
super.layoutChartChildren(top, left, contentWidth, contentHeight);
addInnerCircleIfNotPresent();
updateInnerCircleLayout();
}
private void addInnerCircleIfNotPresent() {
if (getData().size() > 0) {
Node pie = getData().get(0).getNode();
if (pie.getParent() instanceof Pane) {
Pane parent = (Pane) pie.getParent();
if (!parent.getChildren().contains(innerCircle)) {
parent.getChildren().add(innerCircle);
}
}
}
}
private void updateInnerCircleLayout() {
double minX = Double.MAX_VALUE, minY = Double.MAX_VALUE;
double maxX = Double.MIN_VALUE, maxY = Double.MIN_VALUE;
for (PieChart.Data data: getData()) {
Node node = data.getNode();
Bounds bounds = node.getBoundsInParent();
if (bounds.getMinX() < minX) {
minX = bounds.getMinX();
}
if (bounds.getMinY() < minY) {
minY = bounds.getMinY();
}
if (bounds.getMaxX() > maxX) {
maxX = bounds.getMaxX();
}
if (bounds.getMaxY() > maxY) {
maxY = bounds.getMaxY();
}
}
innerCircle.setCenterX(minX + (maxX - minX) / 2);
innerCircle.setCenterY(minY + (maxY - minY) / 2);
innerCircle.setRadius((maxX - minX) / 4);
}
}
import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.Scene;
import javafx.scene.chart.PieChart;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
public class DoughnutChartSample extends Application {
@Override public void start(Stage stage) {
stage.setTitle("Imported Fruits");
stage.setWidth(500);
stage.setHeight(500);
ObservableList<PieChart.Data> pieChartData = createData();
final DoughnutChart chart = new DoughnutChart(pieChartData);
chart.setTitle("Imported Fruits");
Scene scene = new Scene(new StackPane(chart));
stage.setScene(scene);
stage.show();
}
private ObservableList<PieChart.Data> createData() {
return FXCollections.observableArrayList(
new PieChart.Data("Grapefruit", 13),
new PieChart.Data("Oranges", 25),
new PieChart.Data("Plums", 10),
new PieChart.Data("Pears", 22),
new PieChart.Data("Apples", 30));
}
public static void main(String[] args) {
launch(args);
}
}
@jewelsea
Copy link
Author

jewelsea commented Jun 10, 2014

@arunartzoom
Copy link

arunartzoom commented Jan 10, 2017

Hi,
I have two area charts . How can i shade the area between the two lines in javafx. Please see the blue area in the image.
sample

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment