To increase no. of blades dynamically, you need to change no. of arcs you are making, its length and angle difference.
Change your constructor of FanPane
according to below code.
public FanPane(int blade) {
circle.setStroke(Color.BLUE);
circle.setFill(Color.WHITE);
circle.setStrokeWidth(4);
getChildren().add(bpane);
slider1.setShowTickLabels(true);
slider1.setShowTickMarks(true);
slider1.setMajorTickUnit(5);
slider1.setMinorTickCount(0);
slider1.setBlockIncrement(1);
slider2.setShowTickLabels(true);
slider2.setShowTickMarks(true);
slider2.setMajorTickUnit(5);
slider2.setMinorTickCount(0);
slider2.setBlockIncrement(1);
gpane.setConstraints(speed, 0, 0);
gpane.setConstraints(slider1, 1, 0);
gpane.setConstraints(numBlades, 0, 1);
gpane.setConstraints(slider2, 1, 1);
gpane.getChildren().addAll(speed, slider1, numBlades, slider2);
btBox.getChildren().addAll(pauseBt, resumeBt, reverseBt);
topBox.getChildren().addAll(blank, btBox);
Pane pane = new Pane(circle);
bpane.setCenter(pane);
bpane.setTop(topBox);
bpane.setBottom(gpane);
// bpane.setAlignment(topBox, Pos.CENTER);
pauseBt.setOnAction(e -> animation.pause());
resumeBt.setOnAction(e -> animation.play());
reverseBt.setOnAction(e -> this.reverse());
// bpane.widthProperty().addListener(e -> this.setW(this.getWidth()));
// bpane.heightProperty().addListener(e -> this.setH(this.getHeight()));
try {
arc = new Arc[blade];
int angleDiff = 360 / blade;
for (int i = 0; i < blade; i++) {
arc[i] = new Arc(w / 2, h / 2, radius * 0.9, radius * 0.9, startAngle + i * angleDiff, 180 / blade);
arc[i].setFill(Color.RED); // Set fill color
arc[i].setType(ArcType.ROUND);
pane.getChildren().addAll(arc[i]);
}
} catch (ArithmeticException ex) {
blade = 2;
arc = new Arc[blade];
int angleDiff = 360 / blade;
for (int i = 0; i < blade; i++) {
arc[i] = new Arc(w / 2, h / 2, radius * 0.9, radius * 0.9, startAngle + i * angleDiff, 180 / blade);
arc[i].setFill(Color.RED); // Set fill color
arc[i].setType(ArcType.ROUND);
pane.getChildren().addAll(arc[i]);
}
}
}