JavaFX example to show both animating BarChart and PieChart:
package javafx_histogram;
import java.util.Random;
import javafx.animation.KeyFrame;
import javafx.animation.Timeline;
import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.scene.Scene;
import javafx.scene.chart.BarChart;
import javafx.scene.chart.CategoryAxis;
import javafx.scene.chart.NumberAxis;
import javafx.scene.chart.PieChart;
import javafx.scene.chart.XYChart;
import javafx.scene.control.Label;
import javafx.scene.layout.HBox;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import javafx.util.Duration;
/**
* @web http://java-buddy.blogspot.com
*/
public class JavaFX_Histogram extends Application {
int group[] = new int[10];
@Override
public void start(Stage primaryStage) {
prepareData();
Label labelInfo = new Label();
labelInfo.setText(
"java.version: " + System.getProperty("java.version") + "\n"
+ "javafx.runtime.version: " + System.getProperty("javafx.runtime.version")
);
//barChart1 with setAnimated(false)
VBox vBoxBarChart1 = new VBox();
final CategoryAxis xAxis1 = new CategoryAxis();
final NumberAxis yAxis1 = new NumberAxis();
final BarChart<String, Number> barChart1
= new BarChart<>(xAxis1, yAxis1);
barChart1.setCategoryGap(0);
barChart1.setBarGap(0);
barChart1.setMaxSize(500, 450);
XYChart.Series series1 = new XYChart.Series();
series1.getData().add(new XYChart.Data("0-10", group[0]));
series1.getData().add(new XYChart.Data("10-20", group[1]));
series1.getData().add(new XYChart.Data("20-30", group[2]));
series1.getData().add(new XYChart.Data("30-40", group[3]));
series1.getData().add(new XYChart.Data("40-50", group[4]));
series1.getData().add(new XYChart.Data("50-60", group[5]));
series1.getData().add(new XYChart.Data("60-70", group[6]));
series1.getData().add(new XYChart.Data("70-80", group[7]));
series1.getData().add(new XYChart.Data("80-90", group[8]));
series1.getData().add(new XYChart.Data("90-100", group[9]));
barChart1.getData().addAll(series1);
Label labelAnimated1 = new Label();
barChart1.setAnimated(false);
vBoxBarChart1.getChildren().addAll(barChart1, labelAnimated1);
//- End of barChart1
//PieChart2 with setAnimated(false)
VBox vBoxPieChart2 = new VBox();
ObservableList<PieChart.Data> pieChartData
= FXCollections.observableArrayList(
new PieChart.Data("0-10", group[0]),
new PieChart.Data("10-20", group[1]),
new PieChart.Data("20-30", group[2]),
new PieChart.Data("30-40", group[3]),
new PieChart.Data("40-50", group[4]),
new PieChart.Data("50-60", group[5]),
new PieChart.Data("60-70", group[6]),
new PieChart.Data("70-80", group[7]),
new PieChart.Data("80-90", group[8]),
new PieChart.Data("90-100", group[9])
);
final PieChart pieChart2
= new PieChart(pieChartData);
pieChart2.setMaxSize(500, 450);
Label labelAnimated2 = new Label();
pieChart2.setAnimated(false);
vBoxPieChart2.getChildren().addAll(pieChart2, labelAnimated2);
//- End of pieChart2
HBox hBoxCharts = new HBox();
hBoxCharts.getChildren().addAll(vBoxBarChart1, vBoxPieChart2);
Label labelCnt = new Label();
VBox vBox = new VBox();
vBox.getChildren().addAll(labelInfo, hBoxCharts, labelCnt);
StackPane root = new StackPane();
root.getChildren().add(vBox);
Scene scene = new Scene(root, 1000, 500);
primaryStage.setTitle("java-buddy.blogspot.com");
primaryStage.setScene(scene);
primaryStage.show();
Random random = new Random();
//Apply Animating Data in Charts
//ref: http://docs.oracle.com/javafx/2/charts/bar-chart.htm
//"Animating Data in Charts" section
Timeline timeline = new Timeline();
timeline.getKeyFrames().add(
new KeyFrame(Duration.millis(200), (ActionEvent actionEvent) -> {
int data = random.nextInt(100);
/*
final int mean = 50;
final int standardDeviation = 10;
int data = mean + (int) (random.nextGaussian() * standardDeviation);
*/
if (data <= 10) {
group[0]++;
series1.getData().set(0, new XYChart.Data("0-10", group[0]));
pieChartData.set(0, new PieChart.Data("0-10", group[0]));
} else if (data <= 20) {
group[1]++;
series1.getData().set(1, new XYChart.Data("10-20", group[1]));
pieChartData.set(1, new PieChart.Data("10-20", group[1]));
} else if (data <= 30) {
group[2]++;
series1.getData().set(2, new XYChart.Data("20-30", group[2]));
pieChartData.set(2, new PieChart.Data("20-30", group[2]));
} else if (data <= 40) {
group[3]++;
series1.getData().set(3, new XYChart.Data("30-40", group[3]));
pieChartData.set(3, new PieChart.Data("30-40", group[3]));
} else if (data <= 50) {
group[4]++;
series1.getData().set(4, new XYChart.Data("40-50", group[4]));
pieChartData.set(4, new PieChart.Data("40-50", group[4]));
} else if (data <= 60) {
group[5]++;
series1.getData().set(5, new XYChart.Data("50-60", group[5]));
pieChartData.set(5, new PieChart.Data("50-60", group[5]));
} else if (data <= 70) {
group[6]++;
series1.getData().set(6, new XYChart.Data("60-70", group[6]));
pieChartData.set(6, new PieChart.Data("60-70", group[6]));
} else if (data <= 80) {
group[7]++;
series1.getData().set(7, new XYChart.Data("70-80", group[7]));
pieChartData.set(7, new PieChart.Data("70-80", group[7]));
} else if (data <= 90) {
group[8]++;
series1.getData().set(8, new XYChart.Data("80-90", group[8]));
pieChartData.set(8, new PieChart.Data("80-90", group[8]));
} else if (data <= 100) {
group[9]++;
series1.getData().set(9, new XYChart.Data("10-100", group[9]));
pieChartData.set(9, new PieChart.Data("10-100", group[9]));
}
labelAnimated1.setText(
"barChart1.getAnimated() = " + barChart1.getAnimated());
labelAnimated2.setText(
"barChart2.getAnimated() = " + pieChart2.getAnimated());
String s = "";
for (int i = 0; i < 10; i++) {
s += " " + group[i];
}
labelCnt.setText(s);
}));
timeline.setCycleCount(1000);
timeline.setAutoReverse(true); //!?
timeline.play();
}
public static void main(String[] args) {
launch(args);
}
//generate dummy random data
private void prepareData() {
for (int i = 0; i < 10; i++) {
group[i] = 0;
}
}
}

Sir,
ReplyDeleteThanks for the great articles. I would like to know how do you format your code with these line numbers in blog ?