**15.28(显示一个转动的风扇)
编写一个程序显示一个转动的风扇,如图15-33c所示。Pause、Resume和Reverse按钮用于暂停、继续和反转风扇的转动
可修改编程练习题14_9的代码
- 习题思路:
- 新建一个BorderPane,一个Pane和一个HBox,Pane用来装风扇,HBox用于装按钮
- 在Pane面板中新建一个大圆Cirlce,再用for循环绘制四个扇形Arc, 把arc的类型设为ROUND,开始角度每次循环增加90
- 创建一个RotateTransition对象,旋转的节点设为pane
- 把Pane设置在BorderPane的中心
- 创建三个按钮并添加到HBox中,每个按钮都有对应的注册方法(为实现风扇反转功能,可以把动画的速率乘以-1)
- 把HBox设置在BorderPane的底部
示例代码: 编程练习题15_28RotatingFan.java
package chapter_15;
import javafx.animation.RotateTransition;
import javafx.animation.Timeline;
import javafx.application.Application;
import javafx.geometry.Insets;
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;
public class 编程练习题15_28RotatingFan extends Application{
@Override
public void start(Stage primaryStage) throws Exception {
Pane pane = new Pane();
BorderPane borderPane = new BorderPane(pane);
Scene scene = new Scene(borderPane, 400, 420);
borderPane.setMinWidth(400);
borderPane.setMinHeight(420);
pane.setPadding(new Insets(15, 15, 15, 15));
pane.setMaxWidth(400);
pane.setMinWidth(400);
pane.setMaxHeight(400);
pane.setMinHeight(400);
double x = 200;
double y = 200;
Circle c = new Circle(x, y, 80);
c.setStroke(Color.BLACK);
c.setFill(Color.WHITE);
pane.getChildren().add(c);
int angle = 30;
for(int i = 0;i < 4;i++) {
Arc arc1 = new Arc(x, y, 70, 70, angle, 30);
angle += 90;
arc1.setFill(Color.BLUE);
arc1.setType(ArcType.ROUND);
pane.getChildren().add(arc1);
}
RotateTransition rt = new RotateTransition(
Duration.millis(3000),pane);
rt.setByAngle(360);
rt.setCycleCount(Timeline.INDEFINITE);
rt.play();
borderPane.setCenter(pane);
HBox hBox = new HBox();
hBox.setAlignment(Pos.CENTER);
hBox.setSpacing(5);
Button btPause = new Button("Pause");
Button btResume = new Button("Resume");
Button btReverse = new Button("Reverse");
hBox.getChildren().addAll(btPause, btResume, btReverse);
btPause.setOnMouseClicked(e -> rt.pause());
btResume.setOnMouseClicked(e -> rt.play());
btReverse.setOnMouseClicked(e -> rt.setRate(rt.getRate() * -1));// 通过将动画的速率乘以-1,可以实现反转动画的效果。
borderPane.setBottom(hBox);
primaryStage.setTitle("编程练习题15_28RotatingFan");
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
Application.launch(args);
}
}
- 结果展示