目录
题目:**16.18(模拟:一个转动的风扇)
重写编程练习题15.28,增加一个滑动条控制风扇的速度,如图16-43c所示。
-
习题思路
- 就是在15.28的代码上新建一个HBox和一个Slider,然后为Slider注册事件监听器,当Slider中的值改变时将其值设置为RotateTransition的速率。
练习题15.28:Java语言程序设计基础篇_编程练习题**15.28(显示一个转动的风扇)-CSDN博客
-
代码示例
编程练习题16_18ImitateFan.java
package chapter_16;
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.control.Slider;
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 编程练习题16_18ImitateFan 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.setTop(hBox);
Slider slider = new Slider(1,100,1);
slider.setPrefWidth(360);
HBox hBox2 = new HBox(slider);
hBox2.setAlignment(Pos.CENTER);
slider.valueProperty().addListener(ov ->{
rt.setRate(slider.getValue());
});
borderPane.setBottom(hBox2);
primaryStage.setTitle("编程练习题16_18ImitateFan");
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
Application.launch(args);
}
}
-
结果展示