代码中有注释,直接上代码
package com.fan;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Arc;
import javafx.scene.shape.ArcType;
import javafx.scene.shape.Circle;
public class FanPane1 extends Pane {
//12个扇形
private Arc arc[] = new Arc[12];
//设置三个扇形的初始角度
private double startAngle1 = 30;
private double startAngle2 = 30;
private double startAngle3 = 30;
//风扇转动是每次增长的度数
private double increment = 5;
//3个圆
private Circle[] circles = new Circle[3];
public FanPane1(){
for(int i = 100,j=0; i<=600; i+=200,j++){
//设定3个圆的圆心
circles[j] = new Circle();
circles[j].setCenterX(i);
circles[j].setCenterY(200/2);
circles[j].setRadius(70);
//边缘
circles[j].setStroke(Color.BLUE);
//填充颜色
circles[j].setFill(Color.WHITE);
//添加到面板中
getChildren().add(circles[j]);
}
//为每个圆创建风扇
for(int m = 0; m<12; m++){
arc[m] = new Arc();
//一个圆中有四个扇形并绑定圆心
arc[m].centerXProperty().bind(circles[m/4].centerXProperty());
arc[m].centerYProperty().bind(circles[m/4].centerYProperty());
//扇形半径略小于圆
arc[m].radiusXProperty().bind(circles[m/4].radiusProperty().divide(1.1));
arc[m].radiusYProperty().bind(circles[m/4].radiusProperty().divide(1.1));
//圆弧起始位置
arc[m].setStartAngle(30+m*90);
//圆弧长度
arc[m].setLength(60);
arc[m].setFill(Color.BLACK);
arc[m].setType(ArcType.ROUND);
getChildren().addAll(arc[m]);
}
}
//public void reverse(){}
//第一个风扇旋转方法
public void move1(){
setStartAngle1(startAngle1 + increment);
}
//设置角度
public void setStartAngle1(double angle){
startAngle1 = angle;
setValues1();
}
//第二个风扇旋转方法
public void move2(){
setStartAngle2(startAngle2 + increment);
}
public void setStartAngle2(double angle){
startAngle2 = angle;
setValues2();
}
//第三个风扇旋转方法
public void move3(){
setStartAngle3(startAngle3 + increment);
}
public void setStartAngle3(double angle){
startAngle3 = angle;
setValues3();
}
//控制3个风扇旋转的方法
public void move(){
setStartAngle(increment);
}
public void setStartAngle(double angle){
startAngle1 += angle;
startAngle2 += angle;
startAngle3 += angle;
setValues1();
setValues2();
setValues3();
}
/*public void setValues(){
for(int i = 0; i<12; i++){
arc[i].setStartAngle(startAngle + i*90);
}
}
*/
public void setValues1(){
for(int i = 0; i<4; i++){
arc[i].setStartAngle(startAngle1 + i*90);
}
}
public void setValues2(){
for(int i = 4; i<8; i++){
arc[i].setStartAngle(startAngle2 + (i-4)*90);
}
}
public void setValues3(){
for(int i = 8; i<12; i++){
arc[i].setStartAngle(startAngle3 + (i-8)*90);
}
}
}
package com.fan;
//有些类可能不需要导入
import javafx.animation.Animation;
import javafx.animation.KeyFrame;
import javafx.animation.Timeline;
import javafx.application.Application;
import javafx.event.EventHandler;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Arc;
import javafx.scene.shape.ArcType;
import javafx.scene.shape.Circle;
import javafx.stage.Stage;
import javafx.util.Duration;
import javafx.event.ActionEvent;
//import java.awt.event.ActionEvent;
import javax.lang.model.element.ElementVisitor;
import java.util.EventListener;
public class test extends Application {
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) {
//创建三个圆
FanPane1 fan = new FanPane1();
//水平存放按钮,间距为5
HBox hbox = new HBox(5);
Button btPause = new Button("start1");
Button btResume = new Button("end1");
//按钮靠右
hbox.setAlignment(Pos.BOTTOM_LEFT);
hbox.getChildren().addAll(btPause, btResume);
HBox hbox1 = new HBox(5);
Button btPause1 = new Button("start2");
Button btResume1 = new Button("end2");
//按钮放中间
hbox1.setAlignment(Pos.BOTTOM_CENTER);
hbox1.getChildren().addAll(btPause1, btResume1);
HBox hbox2 = new HBox(5);
Button btPause2 = new Button("start3");
Button btResume2 = new Button("end3");
//按钮放在右边
hbox2.setAlignment(Pos.BOTTOM_RIGHT);
hbox2.getChildren().addAll(btPause2, btResume2);
HBox hbox3 = new HBox(5);
Button btPause3 = new Button("start all");
Button btResume3 = new Button("end all");
//Button moreSpdde = new Button("speedUp");
//总控制按钮放中间
hbox3.setAlignment(Pos.BOTTOM_CENTER);
hbox3.getChildren().addAll(btPause3,btResume3/*,moreSpdde*/);
//三个圆放在最上方
BorderPane pane = new BorderPane();
pane.setTop(fan);
//控制三个圆的按钮放在分别放在左中右
pane.setLeft(hbox);
pane.setCenter(hbox1);
pane.setRight(hbox2);
pane.setBottom(hbox3);
//创建控制面板
Scene scene = new Scene(pane, 600, 300);
primaryStage.setTitle("三个风扇");
primaryStage.setScene(scene);
primaryStage.show();
//一开始风扇都处于静止状态
//对于第一个风扇,创建一个KeyFrame用于每100ms运行一个动作事件move1
Timeline animation = new Timeline(new KeyFrame(Duration.millis(30),e->fan.move1()));
animation.setCycleCount(Timeline.INDEFINITE);
//对于第一个风扇,创建一个KeyFrame用于每100ms运行一个动作事件move1
Timeline animation1 = new Timeline(new KeyFrame(Duration.millis(30),e->fan.move2()));
animation1.setCycleCount(Timeline.INDEFINITE);
//对于第一个风扇,创建一个KeyFrame用于每100ms运行一个动作事件move1
Timeline animation2 = new Timeline(new KeyFrame(Duration.millis(30),e->fan.move3()));
animation2.setCycleCount(Timeline.INDEFINITE);
//使用lambda表达式简化表达式
//点击start按钮开始转动
btPause.setOnAction(e->animation.play());
//点击end按钮结束
btResume.setOnAction(e->animation.pause());
btPause1.setOnAction(e->animation1.play());
btResume1.setOnAction(e->animation1.pause());
btPause2.setOnAction(e->animation2.play());
btResume2.setOnAction(e->animation2.pause());
//点击start all按钮所有风扇开始
btResume3.setOnAction(e-> {
animation.pause();
animation1.pause();
animation2.pause();
});
//点击end all按钮所有风扇停止
btPause3.setOnAction(e-> {
animation.play();
animation1.play();
animation2.play();
});
}
}
测试结果
本来还想加一个控制速度的按钮的,但是没有实现