Run the ClockAnimation Explain in your own words how the animation works. 1 impo
ID: 3846274 • Letter: R
Question
Run the ClockAnimation Explain in your own words how the animation works. 1 import javafx.application.Application; 2 import javafx.stage.Stage; 3 import javafx.animation.KeyFrame; 4 import javafx.animation.Timeline; 5 import javafx.event.ActionEvent; 6 import javafx.event.EventHandler; 7 import javafx.scene.Scene; 8 import javafx.util.Duration; 9 10 public class ClockAnimation extends Application { 11 @Override//Override the start method in the Application class 12 public void start(Stage primaryStage) { 13 ClockPane clock = new ClockPane();//Create a clock create a clock 14 15//Create a handler for animation 16 EventHandler eventHandler = e - > { create a handler 17 clock.setCurrentTime();//Set a new clock time 18 }; 19 20//Create an animation for a running clock 21 Timeline animation = new Timeline(create a time line 22 new KeyFrame(Duration.millis(1000), eventHandler)); 23 animation.setCycleCount(Timeline.INDEFINITE); 24 animation.play();//Start animation 25 26//Create a scene and place it in the stage 27 Scene scene = new Scene(clock, 250, 50); 28 primaryStage.setTitle("ClockAnimation");//Set the stage title 29 primaryStage.setScene(scene);//Place the scene in the stage 30 primaryStage.show();//Display the stage 31 } 32 }Explanation / Answer
public class ClockAnimation extends Application {
@Override //override the start method in the application class
public void start(Stage primaryStage) throws IOException {
ClockPane clock = new ClockPane(); //create a clock
EventHandler<ActionEvent> eventHandler = e -> {
clock.setCurrentTime();
};
Timeline animation = new Timeline(new KeyFrame(Duration.millis(1000), eventHandler));
animation.setCycleCount(Timeline.INDEFINITE);
animation.play();
Button cloc = new Button("clock");
Button time = new Button("time");
//create hbox
HBox hBox = new HBox(cloc, time);
cloc.setOnAction(e -> primaryStage.set(new Scene(new BorderPane(clock, null, null, hBox, null),200,200)));
time.setOnAction(e -> primaryStage.setScene(new Scene(new BorderPane(new DigitalClock(), null, null, hBox, null),200,200)));
BorderPane borderPane = new BorderPane(clock, null, null, hBox, null);
primaryStage.setScene(new Scene(borderPane,200,200));
primaryStage.setTitle("ClockAnimation");
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
class ClockPane extends Pane {
private int hour;
private int minute;
private int second;
public ClockPane() {
setCurrentTime();
}
public ClockPane(int hour, int minute, int second) {
this.hour = hour;
this.minute = minute;
this.second = second;
}
public int getHour() {
return hour;
}
public void setHour(int hour) {
this.hour = hour;
paintClock();
}
public int getMinute() {
return minute;
}
public void setMinute(int minute) {
this.minute = minute;
paintClock();
}
public int getSecond() {
return second;
}
public void setSecond(int second) {
this.second = second;
paintClock();
}
public void setCurrentTime() {
Calendar calendar = new GregorianCalendar();
this.hour = calendar.get(Calendar.HOUR_OF_DAY);
this.minute = calendar.get(Calendar.MINUTE);
this.second = calendar.get(Calendar.SECOND);
paintClock();
}
private void paintClock() {
double clockRadius = Math.min(getWidth(), getHeight()) * 0.8 * 0.5;
double centerX = getWidth() / 2;
double centerY = getHeight() / 2;
Circle circle = new Circle(centerX, centerY, clockRadius);
circle.setFill(Color.WHITE);
circle.setStroke(Color.BLACK);
Text t1 = new Text(centerX - 5, centerY - clockRadius + 12, "12");
Text t2 = new Text(centerX - clockRadius + 3, centerY + 5, "9");
Text t3 = new Text(centerX + clockRadius - 10, centerY + 3, "3");
Text t4 = new Text(centerX - 3, centerY + clockRadius - 3, "6");
double sLength = clockRadius * 0.8;
double secondX = centerX + sLength * Math.sin(second * (2 * Math.PI / 60));
double secondY = centerY - sLength * Math.cos(second * (2 * Math.PI / 60));
Line sLine = new Line(centerX, centerY, secondX, secondY);
sLine.setStroke(Color.RED);
double mLength = clockRadius * 0.65;
double xMinute = centerX + mLength * Math.sin(minute * (2 * Math.PI / 60));
double minuteY = centerY - mLength * Math.cos(minute * (2 * Math.PI / 60));
Line mLine = new Line(centerX, centerY, xMinute, minuteY);
mLine.setStroke(Color.BLUE);
double hLength = clockRadius * 0.5;
double hourX = centerX + hLength * Math.sin((hour % 12 + minute / 60.0) * (2 * Math.PI / 12));
double hourY = centerY - hLength * Math.cos((hour % 12 + minute / 60.0) * (2 * Math.PI / 12));
Line hLine = new Line(centerX, centerY, hourX, hourY);
hLine.setStroke(Color.GREEN);
getChildren().clear();
getChildren().addAll(circle, t1, t2, t3, t4, sLine, mLine, hLine);
}
@Override
public void setWidth(double width) {
super.setWidth(width);
paintClock();
}
@Override
public void setHeight(double height) {
super.setHeight(height);
paintClock();
}
}
class DigitalClock extends Label {
public DigitalClock() {
bindToTime();
}
private void bindToTime() {
Timeline timeline = new Timeline(
new KeyFrame(Duration.seconds(0),
new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent actionEvent) {
Calendar time = Calendar.getInstance();
String hourString = StringUtilities.pad(2, ' ', time.get(Calendar.HOUR) == 0 ? "12" : time.get(Calendar.HOUR) + "");
String minuteString = StringUtilities.pad(2, '0', time.get(Calendar.MINUTE) + "");
String secondString = StringUtilities.pad(2, '0', time.get(Calendar.SECOND) + "");
String ampmString = time.get(Calendar.AM_PM) == Calendar.AM ? "AM" : "PM";
setText(hourString + ":" + minuteString + ":" + secondString + " " + ampmString);
}
}
),
new KeyFrame(Duration.seconds(1))
);
timeline.setCycleCount(Animation.INDEFINITE);
timeline.play();
}
}
class StringUtilities {
public static String pad(int fieldWidth, char padChar, String s) {
StringBuilder sb = new StringBuilder();
for (int i = s.length(); i < fieldWidth; i++) {
sb.append(padChar);
}
sb.append(s);
return sb.toString();
}
}
Related Questions
Navigate
Integrity-first tutoring: explanations and feedback only — we do not complete graded work. Learn more.