Created
April 5, 2021 16:51
-
-
Save jananpatel2002/04d8d7e12439704abd80c782ea35ce8d to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
* Name: Janan Patel | |
* Date: 4/5/2021 | |
* Course Number: CSC 112 | |
* Course Name: Computer Science | |
* Problem Number: 9 | |
* Email:jkpatel2001@student.stcc.edu | |
* Short Description of the Problem: Clock with buttons | |
*/ | |
import javafx.application.Application; | |
import javafx.scene.Scene; | |
import javafx.stage.Stage; | |
import javafx.scene.control.Button; | |
import javafx.scene.control.Label; | |
import javafx.scene.control.TextField; | |
import javafx.scene.layout.BorderPane; | |
import javafx.scene.layout.HBox; | |
import javafx.scene.layout.VBox; | |
import javafx.geometry.Pos; | |
import javafx.geometry.Insets; | |
import javafx.scene.input.KeyCode; | |
public class ClockGUI extends Application { | |
TextField TextFieldH = new TextField(); | |
TextField TextFieldM = new TextField(); | |
TextField TextFieldS = new TextField(); | |
ClockPane clock = new ClockPane(); | |
@Override | |
public void start(Stage primaryStage) { | |
AppGUI scene = new AppGUI(); | |
Scene scene1 = new Scene(scene, 550, 300); | |
primaryStage.setTitle("Janan's clock"); | |
primaryStage.setScene(scene1); | |
primaryStage.setResizable(false); | |
primaryStage.show(); | |
} | |
// Override the start method in the Application class | |
public static void main(String[] args) { | |
launch(args); | |
} | |
private void changeClock() { | |
clock.setHour(Integer.parseInt(TextFieldH.getText())); | |
clock.setMinute(Integer.parseInt(TextFieldM.getText())); | |
clock.setSecond(Integer.parseInt(TextFieldS.getText())); | |
} | |
private class AppGUI extends BorderPane { | |
public AppGUI() { | |
ControlButtonsPane cbp = new ControlButtonsPane(); | |
CircleBuilder cbr = new CircleBuilder(); | |
TextFields tfs = new TextFields(); | |
this.setTop(cbp); | |
this.setCenter(cbr); | |
this.setBottom(tfs); | |
} | |
} | |
private class ControlButtonsPane extends HBox { | |
public ControlButtonsPane() { | |
this.setAlignment(Pos.CENTER); | |
this.setSpacing(10); | |
Button startButton = new Button("Start"); | |
startButton.setOnAction(e -> { | |
clock.tick(); | |
}); | |
Button stopButton = new Button("Stop"); | |
stopButton.setOnAction(e -> { | |
clock.stop(); | |
}); | |
Button LoadCurrentTimeStart = new Button("Load Current Time & Start"); | |
LoadCurrentTimeStart.setOnAction(e -> { | |
clock.setCurrentTime(); | |
clock.tick(); | |
}); | |
Button JustLoadCurrentTime = new Button("Just Load Current Time"); | |
JustLoadCurrentTime.setOnAction(e -> { | |
clock.setCurrentTime(); | |
clock.stop(); | |
}); | |
this.getChildren().addAll(startButton, stopButton, LoadCurrentTimeStart, JustLoadCurrentTime); | |
} | |
} | |
private class CircleBuilder extends VBox { | |
public CircleBuilder() { | |
clock.setW(550); | |
clock.setH(225); | |
this.getChildren().addAll(clock); | |
} | |
} | |
private class TextFields extends HBox { | |
public TextFields() { | |
this.setAlignment(Pos.CENTER); | |
this.setPadding(new Insets(10)); | |
this.setSpacing(10); | |
TextFieldH.setPrefColumnCount(3); | |
TextFieldS.setPrefColumnCount(3); | |
TextFieldM.setPrefColumnCount(3); | |
TextFieldH.setOnKeyPressed(e -> { | |
if (e.getCode() == KeyCode.ENTER) { | |
try { | |
changeClock(); | |
clock.stop(); | |
} catch (NumberFormatException ex) { | |
System.out.println("Please make sure that each field has a number"); | |
} | |
} | |
}); | |
TextFieldM.setOnKeyPressed(e -> { | |
if (e.getCode() == KeyCode.ENTER) { | |
try { | |
changeClock(); | |
clock.stop(); | |
} catch (NumberFormatException ex) { | |
System.out.println("Please make sure that each field has a number"); | |
} | |
} | |
}); | |
TextFieldS.setOnKeyPressed(e -> { | |
if (e.getCode() == KeyCode.ENTER) { | |
try { | |
changeClock(); | |
clock.stop(); | |
} catch (NumberFormatException ex) { | |
System.out.println("Please make sure that each field has a number"); | |
} | |
} | |
}); | |
this.getChildren().addAll(new Label("Hour: "), TextFieldH, new Label("Minute: "), TextFieldM, | |
new Label("Second: "), TextFieldS); | |
} | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import javafx.animation.Animation; | |
import javafx.animation.Timeline; | |
import javafx.animation.KeyFrame; | |
import java.util.Calendar; | |
import java.util.GregorianCalendar; | |
import javafx.scene.layout.Pane; | |
import javafx.scene.paint.Color; | |
import javafx.scene.shape.Circle; | |
import javafx.scene.shape.Line; | |
import javafx.scene.text.Text; | |
import javafx.util.Duration; | |
public class ClockPane extends Pane { | |
private int hour; | |
private int minute; | |
private int second; | |
Timeline animation; | |
// Clock pane's width and height | |
private double w; | |
private double h; | |
/** Construct a default clock with the current time */ | |
public ClockPane() { | |
setCurrentTime(); | |
animation = new Timeline(new KeyFrame(Duration.millis(1000), e -> tick())); | |
animation.setCycleCount(Timeline.INDEFINITE); | |
animation.play(); | |
} | |
/** Construct a click with specified hour, minute, and second */ | |
public ClockPane(int hour, int minute, int second) { | |
this.hour = hour; | |
this.minute = minute; | |
this.second = second; | |
} | |
/** Return hour */ | |
public int getHour() { | |
return hour; | |
} | |
/** Set a new hour */ | |
public void setHour(int hour) { | |
this.hour = hour; | |
paintClock(); | |
} | |
/** Return minute */ | |
public int getMinute() { | |
return minute; | |
} | |
/** Set a new minute */ | |
public void setMinute(int minute) { | |
this.minute = minute; | |
paintClock(); | |
} | |
/** Return second */ | |
public int getSecond() { | |
return second; | |
} | |
/** Set a new second */ | |
public void setSecond(int second) { | |
this.second = second; | |
paintClock(); | |
} | |
/** Return clock pane's width */ | |
public double getW() { | |
return w; | |
} | |
/** Set clock pane's width */ | |
public void setW(double w) { | |
this.w = w; | |
paintClock(); | |
} | |
/** Return clock pane's height */ | |
public double getH() { | |
return h; | |
} | |
/** Set clock pane's heigt */ | |
public void setH(double h) { | |
this.h = h; | |
paintClock(); | |
} | |
/* Set the current time for the clock */ | |
public void setCurrentTime() { | |
// Construct a Calendar for the current date and time | |
Calendar calendar = new GregorianCalendar(); | |
// Set current hour, minute and second | |
this.hour = calendar.get(Calendar.HOUR_OF_DAY); | |
this.minute = calendar.get(Calendar.MINUTE); | |
this.second = calendar.get(Calendar.SECOND); | |
paintClock(); // Repaint the clock | |
} | |
/** Paint the clock */ | |
protected void paintClock() { | |
// Initialize clock parameters | |
double clockRadius = Math.min(w, h) * 0.8 * 0.5; | |
double centerX = w / 2; | |
double centerY = h / 2; | |
// Draw circle | |
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"); | |
// Draw second hand | |
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); | |
// Draw minute hand | |
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); | |
// Draw hour hand | |
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); | |
} | |
protected void tick() { | |
this.second++; | |
if (this.second >= 60) { | |
this.second = 0; | |
this.minute++; | |
if (this.minute >= 60) { | |
this.minute = 0; | |
this.hour++; | |
if (this.hour >= 13) | |
this.hour %= 12; | |
} | |
} | |
this.paintClock(); | |
this.animation.play(); | |
} | |
protected void stop() { | |
this.animation.pause(); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment