Chapter 21: Problem 18
\((\text {Analog Clock})\) Create a Java program that displays an analog clock with hour, minute and second hands that move appropriately as the time changes.
Short Answer
Expert verified
Create a Java `JPanel` subclass to draw clock hands using angles based on current time and redraw every second.
Step by step solution
01
Import Necessary Classes
Begin by importing the necessary Java classes. You'll need `javax.swing` for the graphical user interface components and `java.awt` for the drawing capabilities. Also, import `java.util.Calendar` to get the current time.
```java
import javax.swing.*;
import java.awt.*;
import java.util.Calendar;
```
02
Create the Analog Clock Class
Create a new class called `AnalogClock` that extends `JPanel`. This class will manage the painting of the clock itself.
```java
public class AnalogClock extends JPanel {
// Class contents go here
}
```
03
Override the PaintComponent Method
Inside the `AnalogClock` class, override the `paintComponent` method. This method will be used to draw the clock's face and hands every time the panel needs to be painted.
```java
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
// Further drawing instructions will be added here
}
```
04
Calculate Hand Positions
Within the `paintComponent` method, calculate the angles for the hour, minute, and second hands. Use `Calendar` to get the current time and convert it into angles.
```java
Calendar now = Calendar.getInstance();
int hours = now.get(Calendar.HOUR);
int minutes = now.get(Calendar.MINUTE);
int seconds = now.get(Calendar.SECOND);
// Calculate angles in radians
double secondAngle = Math.toRadians(seconds * 6);
double minuteAngle = Math.toRadians((minutes + seconds / 60.0) * 6);
double hourAngle = Math.toRadians((hours + minutes / 60.0) * 30);
```
05
Draw Clock Face and Hands
Use `Graphics2D` to draw the clock face (a simple circle) and the hands. Calculate the end points of each hand using trigonometric functions.
```java
// Draw the clock face
int radius = Math.min(getWidth(), getHeight()) / 2;
g2.drawOval(getWidth()/2 - radius, getHeight()/2 - radius, radius*2, radius*2);
// Draw each hand
int centerX = getWidth()/2;
int centerY = getHeight()/2;
// Second hand
int secondHandX = centerX + (int)(radius * 0.9 * Math.sin(secondAngle));
int secondHandY = centerY - (int)(radius * 0.9 * Math.cos(secondAngle));
g2.drawLine(centerX, centerY, secondHandX, secondHandY);
// Minute hand
int minuteHandX = centerX + (int)(radius * 0.8 * Math.sin(minuteAngle));
int minuteHandY = centerY - (int)(radius * 0.8 * Math.cos(minuteAngle));
g2.drawLine(centerX, centerY, minuteHandX, minuteHandY);
// Hour hand
int hourHandX = centerX + (int)(radius * 0.6 * Math.sin(hourAngle));
int hourHandY = centerY - (int)(radius * 0.6 * Math.cos(hourAngle));
g2.drawLine(centerX, centerY, hourHandX, hourHandY);
```
06
Create a JFrame Window
Now, create a `JFrame` to display the `AnalogClock` component. Set up the main method to initialize the frame and start the clock.
```java
public static void main(String[] args) {
JFrame frame = new JFrame("Analog Clock");
AnalogClock clock = new AnalogClock();
frame.add(clock);
frame.setSize(400, 400);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
// Redraw the clock every second
new javax.swing.Timer(1000, e -> clock.repaint()).start();
}
```
Unlock Step-by-Step Solutions & Ace Your Exams!
-
Full Textbook Solutions
Get detailed explanations and key concepts
-
Unlimited Al creation
Al flashcards, explanations, exams and more...
-
Ads-free access
To over 500 millions flashcards
-
Money-back guarantee
We refund you if you fail your exam.
Over 30 million students worldwide already upgrade their learning with Vaia!
Key Concepts
These are the key concepts you need to understand to accurately answer the question.
Graphics Programming
Graphics programming involves creating programs that can visually display information on a screen. In the context of Java, it focuses on using the Java AWT and Swing libraries to create graphical user interfaces and drawings.
Graphics programming requires understanding of how coordinates, colors, and font settings work.
Developers often work with methods like `paintComponent` to draw shapes, images, and text
Graphics programming requires understanding of how coordinates, colors, and font settings work.
Developers often work with methods like `paintComponent` to draw shapes, images, and text
- The `Graphics` class provides basic drawing capabilities.
- The `Graphics2D` subclass offers more sophisticated control over geometry, coordinate transformations, color management, and text layout.
Java AWT
The Abstract Window Toolkit (AWT) is a foundational Java library for creating GUIs. It includes components like windows, buttons, and other interactive elements.
AWT acts as the base layer for Java's more advanced Swing library.
When working with graphics, AWT provides key classes and methods to draw graphics and control the GUI layout:
AWT acts as the base layer for Java's more advanced Swing library.
When working with graphics, AWT provides key classes and methods to draw graphics and control the GUI layout:
- `java.awt.Graphics`: Provides primary methods for drawing shapes and text.
- `java.awt.Color`: Lets you set colors for drawing.
- `java.awt.Dimension`: Useful for specifying the dimension of components.
Java Timer
A Java Timer is a utility for scheduling tasks for future execution in a background thread. For graphics programming, it's particularly useful for updating components like an analog clock that need to be redrawn at regular intervals.
In Java, the Swing library provides `javax.swing.Timer`, which is used to schedule events in a Swing application.
Here are some key features of the Java Timer:
In Java, the Swing library provides `javax.swing.Timer`, which is used to schedule events in a Swing application.
Here are some key features of the Java Timer:
- `Timer(int delay, ActionListener listener)`: Creates a new Timer with a specified delay in milliseconds between action events.
- `start()`: Starts the Timer, causing it to start sending ActionEvents to its listeners.
- `stop()`: Halts the Timer, pausing event generation until it is restarted.
Analog Clock Design
Analog clock design in Java involves creating a graphical representation of a classic clock face with hands that indicate the current time. The design requires translating time into graphical movements of the hour, minute, and second hands.
When designing an analog clock:
When designing an analog clock:
- Get the current time using `Calendar` to retrieve the current hour, minute, and second.
- Use trigonometry to calculate the angles for each hand and convert these into x and y coordinates for drawing.
- A circle is drawn as the clock's face with hands originating from the center.